スレッド・Runnable
スレッド(Thread)と同じであるような記事がありますが、違いがあります。
public interface Runnable
と定義されています。

スレッド
extens Thread
で継承します。

Runnable
implements Runnable
で実装します。

public interface Runnable
なのでThreadのようにクラスではありません。
サンプルとしてRunnableSimpleを作ってみます。
public class RunnableSimple implements Runnable{
    //スレッドを識別するためにnameフィールドを設定する
    private String myName;

    //スレッド名を設定 コンストラクター
    public RunnableSimple(String name){
        myName = name;
    }

    //スレッドの実処理
    public void run(){
        for(int i= 0; i <= 50; i++){
            Log.d(myName, "count = " + i);
        }
    }
}

Threadと違うのは、
extends ではなく implements をつかうこと
runは、
public abstract void run ()
で定義されています。
@Overrideは使いません。

次にRunnableSimpleの実装です。
                   
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //スレッドを生成
        Thread t1 = new Thread (new RunnableSimple("Thread_1"));
        Thread t2 = new Thread (new RunnableSimple("Thread_2"));
        Thread t3 = new Thread (new RunnableSimple("Thread_3"));

        t1.start();
        t2.start();
        t3.start();

        Log.d("MainActivity", "MainActivity is finished.");
    }
}

Threadとなんとなく似ています。しかし、実行結果が違います。

    D/Thread_1: count = 0
    D/Thread_1: count = 1
    D/MainActivity: MainActivity is finished.
    D/Thread_1: count = 2
    D/Thread_1: count = 3
    D/Thread_1: count = 4
    
synchronizedで修飾したように他のスレッドに邪魔をされることなく50までカウントアップされます。