スレッドとプロセスの違い
- プロセス:プロセスは、リソース割り当ての基本単位です。コンピューターは、メモリ内の特定の領域などの特定のリソースを特定のプロセスに分割します。このプロセスは、このリソースのみを占有し、他のプロセスからアクセスすることはできません。
- スレッド:スレッドは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でスレッドを開始した方法です。
要約する
- 実行可能なインターフェイスは、抽象メソッドrun()を使用した通常のインターフェイスです。
- 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方法才会被调用。