マルチスレッド実装方法:
Threadクラスを継承
Runnableクラスを実装
----------------------------- --- --------------------------------------------------- --- ----
1. Threadクラスを継承する
Threadクラスを継承したら、親クラスのpublic void run()メソッドをスレッドのmainメソッドとしてオーバーライドする必要があります。
すべてのスレッドの実行は同時である必要があります。つまり、複数のスレッドが同じ期間に交互に実行されます。この目的を達成するには、run() メソッドを直接呼び出すのではなく、Thread クラスの start() メソッドを呼び出して複数のスレッドを開始する必要があります。
start()メソッドの呼び出しとrun()メソッドの呼び出しの比較:
public class MyThread extends Thread { private String name; public MyThread(String name) { this.name = name; } @Override public void run() { for(int i=0; i<10; i++) { System.out.println(name + "打印:" + i); } } public static void main(String[] args) { MyThread mt1 = new MyThread("线程A"); MyThread mt2 = new MyThread("线程B"); MyThread mt3 = new MyThread("线程C"); mt1.start(); mt2.start(); mt3.start(); } }
実行結果: (3つのスレッドが同時に交互に実行され、実行順序は固定されません)
public class MyThread extends Thread { private String name; public MyThread(String name) { this.name = name; } @Override public void run() { for(int i=0; i<5; i++) { System.out.println(name + "打印:" + i); } } public static void main(String[] args) { MyThread mt1 = new MyThread("线程A"); MyThread mt2 = new MyThread("线程B"); MyThread mt3 = new MyThread("线程C"); mt1.run(); mt2.run(); mt3.run(); } }
実行結果: ( 3つのプログラムを順番に実行します)
2. start()メソッドはマルチスレッドの原理を実装します
Threadクラスのソースコードのstart()メソッド部分を開きます:
public synchronized void start() { if (threadStatus != 0) throw new IllegalThreadStateException(); group.add(this); boolean started = false; try { start0(); started = true; } finally { try { if (!started) { group.threadStartFailed(this); } } catch (Throwable ignore) { } } } private native void start0();
ネイティブキーワードはオペレーティング システムを呼び出すメソッド。start0 () メソッドはオペレーティング システムのメソッドです。
スレッドの起動にはオペレーティングシステム内のリソースの割り当てが含まれるため、特定のスレッドの起動はオペレーティングシステムごとに異なる方法で実装される必要があります。 JVM は、さまざまなオペレーティング システムで定義されている start0() メソッドに従ってさまざまな実装を実装します。このように、start0() メソッドの名前はマルチスレッド レベルで変更されず、オペレーティング システムが異なれば実装も異なります。
概略図
結論: Thread クラスの start() メソッドのみがオペレーティング システム リソースを割り当てることができるため、マルチスレッドを開始する方法は常に Thread クラスの start() メソッドです。