Javaスレッドの要約(1)-スレッドとランナブルの違い

スレッドとプロセスの違い

  • プロセス:プロセスは、リソース割り当ての基本単位です。コンピューターは、メモリ内の特定の領域などの特定のリソースを特定のプロセスに分割します。このプロセスは、このリソースのみを占有し、他のプロセスからアクセスすることはできません。
  • スレッド:スレッドはCPUスケジューリングの基本単位であり、CPUはタイムスライスローテーション方式で固定タイムスライスでスレッドを実行します。プロセスには、プログラムのさまざまな実行ルートを表す1つ以上のスレッドが存在する可能性があり、同じプロセス内のさまざまなスレッドが同じメモリリソースを共有します。

2.スレッドを開始する方法

2.1スレッド/実行可能

2.1.1スレッド

new Thread() {
    @Override
    public void run() {
        log("Thread run");
    }
}.start();
复制代码

出力:

Thread run
复制代码

2.1.2Runnable経由

new Thread(new Runnable() {
    @Override
    public void run() {
        log("Runnable run");
    }
}).start();
复制代码

出力:

Runnable run
复制代码

2.1.3スレッドとランナブルの違い

Runnableインターフェースの構造を最初に見てください

public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}
复制代码

その構造は非常に単純で、抽象メソッドrun()が1つしかないことがわかります。
スレッドのstart()メソッドをもう一度見てください

/**
 * Causes this thread to begin execution; 
 * the Java Virtual Machine calls the run method of this thread.
 * ...
 */
public synchronized void start() {
    ...
}
复制代码

start()メソッドの内容は私たちにとってそれほど重要ではありません。重要なのは最初のコメントです。スレッドを開始するには、スレッドの実行開始後にJava仮想マシンによってrun()メソッドが呼び出されるので、スレッドのrun()を見てください。)メソッド

@Override
public void run() {
    if (target != null) {
        target.run();
    }
}
复制代码

Threadのrunメソッドは、null判定のみを実行します。ターゲットが空でない場合、ターゲットのrunメソッドが呼び出され、次にターゲットは何ですか。

public Thread(Runnable target) {
    init(null, target, "Thread-" + nextThreadNum(), 0);
}
复制代码

このターゲットは、スレッドコンストラクターで渡したRunnableであることがわかります。これは、セクション2.1.2でスレッドを開始した方法です。

要約する

  1. 実行可能なインターフェイスは、抽象メソッドrun()を使用した通常のインターフェイスです。
  2. Threadのrunメソッドは、スレッドの呼び出しが開始された後の特定の時間に仮想マシンによって呼び出されます。Threadに保持されているRunnableタイプのターゲット変数が空でない場合、ターゲットのrunメソッドが呼び出されます。

考える

Threadのrunメソッドをオーバーライドして、runnableを使用できますか?理論的には可能です、試してみましょう

public static void testThreadRunnable() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            log("Runnable run");
        }
    }) {
        @Override
        public void run() {
            super.run();
            log("Thread run");
        }
    }.start();
}
复制代码

出力

Runnable run
Thread run
复制代码

可以看到实际上也是可以的,需要注意的是,我们重写的Thread的run方法需要调用 “super.run()”,只有这样Runnable里的run方法才会被调用。

おすすめ

転載: juejin.im/post/7087480615053819940