Java でのスレッドの作成は、次の 3 つの基本形式で一般的です:
1. Thread クラスを継承し、このクラスの run() メソッドをオーバーライドします。
Thread クラスを継承し、このクラスの run() メソッドをオーバーライドします
public class MyThread extends Thread{ @Override public void run() { for (int i = 0 ;i < 50;i++) { System.out.println(Thread.currentThread().getName() + ":" + i); } } public static void main(String[] args) { for (int i = 0;i<50;i++) { //调用Thread类的currentThread()方法获取当前线程 System.out.println(Thread.currentThread().getName() + " " + i); if (i == 10) { new MyThread().start(); new MyThread().start(); } } } }
実行結果:
... main 48 main 49 Thread-0:0 Thread-0:1 Thread-0:2 Thread-0:3 Thread-0:4 Thread-1:0 ...
結果からわかります:
1. 3 つのスレッドがあります: main、Thread-0、Thread-1;
2. 2 つのスレッド Thread-0 と Thread によって出力されるメンバー変数 i の値-1 は連続ではありません (ここではローカル変数ではなくインスタンス変数です)。理由: Thread クラスを継承してマルチスレッドを実装する場合、各スレッドの作成には異なるサブクラス オブジェクトの作成が必要となり、その結果、2 つのスレッド Thread-0 と Thread-1 がメンバー変数 i を共有できなくなります。
##3, スレッドの実行はプリエンプティブであり、Thread-0 または Thread-1 が常に CPU を占有するとは限りません (これはスレッドの優先順位にも関係します。ここでは、Thread-0 と Thread-1 1 は同じスレッド優先度を持っています。スレッド優先度に関する知識はここでは入手できません。展開) (学習ビデオの推奨:java ビデオ チュートリアル )
2. Runnable インターフェイスを実装してスレッド クラスを作成する
Runnable インターフェイスを実装するクラスを定義し、このクラスのインスタンス オブジェクト obj を作成し、obj をコンストラクター パラメーターとして Thread クラスのインスタンス オブジェクトに渡します。 object は実際のスレッド オブジェクトです。public class MyRunnable implements Runnable { @Override public void run() { for (int i = 0 ;i < 50 ;i++) { System.out.println(Thread.currentThread().getName()+":" +i); } } public static void main(String[] args) { for (int i = 0;i < 50;i++) { System.out.println(Thread.currentThread().getName() + ":" +i); if (i == 10) { MyRunnable myRunnable = new MyRunnable(); new Thread(myRunnable).start(); new Thread(myRunnable).start(); } } //java8 labdam方式 new Thread(() -> { System.out.println(Thread.currentThread().getName()); },"线程3").start(); } }実行結果:
... main:46 main:47 main:48 main:49 Thread-0:28 Thread-0:29 Thread-0:30 Thread-1:30 ...1. スレッド 1 とスレッド 2 が出力するメンバー変数 i は連続しているため、このようにスレッドを作成することで、複数のスレッドでスレッド クラスを共有できます。インスタンス変数。ここでは複数のスレッドが同じターゲット インスタンス変数を使用するためです。ただし、上記のコードを実行すると、実際には結果が連続していないことがわかります。これは、複数のスレッドが同じリソースにアクセスするときに、リソースがロックされていないと、スレッドの安全性の問題が発生するためです。
2. Java8 ではラムダメソッドを使用してマルチスレッドを作成できます。
3. Callable インターフェイスと Future インターフェイスを介してスレッドを作成する
Callable インターフェイス実装クラスを作成し、スレッドの実行本体として機能する call() メソッドを実装します。メソッドには戻り値があり、Callable 実装クラスのインスタンスを作成します。FutureTask クラスを使用して Callable オブジェクトをラップし、Callable オブジェクトの call() メソッドの戻り値をカプセル化します。FutureTask オブジェクトを使用します。新しい Thread を作成して開始するには Thread オブジェクトのターゲットとして指定し、子スレッドの実行終了後に FutureTask オブジェクトの get() メソッドを呼び出して戻り値を取得します。public class MyCallable implements Callable<Integer> { private int i = 0; @Override public Integer call() throws Exception { int sum = 0; for (; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " " + i); sum += i; } return sum; } public static void main(String[] args) throws ExecutionException, InterruptedException { // 创建MyCallable对象 Callable<Integer> myCallable = new MyCallable(); //使用FutureTask来包装MyCallable对象 FutureTask<Integer> ft = new FutureTask<Integer>(myCallable); for (int i = 0;i<50;i++) { System.out.println(Thread.currentThread().getName() + ":" + i); if (i == 30) { Thread thread = new Thread(ft); thread.start(); } } System.out.println("主线程for循环执行完毕.."); Integer integer = ft.get(); System.out.println("sum = "+ integer); } }call() メソッドの戻り値の型は、FutureTask オブジェクトの作成時の a8093152e673feb7aba1828c43532094 の型と一致します。 関連チュートリアルの推奨事項:
以上がJavaマルチスレッドの作成と起動の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。