最初にサンプルコードを見てみましょう
import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; public class Main { public static void main(String[] args) { //方法一:继承Thread int i = 0; // for(; i < 100; i++){ // System.out.println(Thread.currentThread().getName() + " " + i); // if (i == 5) { // ThreadExtendsThread threadExtendsThread = new ThreadExtendsThread(); // threadExtendsThread.start(); // } // } //方法二:实现Runnable // for(i = 0; i < 100; i++){ // System.out.println(Thread.currentThread().getName() + " " + i); // if (i == 5) { // Runnable runnable = new ThreadImplementsRunnable(); // new Thread(runnable).start(); // new Thread(runnable).start(); // } // } //方法三:实现Callable接口 Callable<Integer> callable = new ThreadImplementsCallable(); FutureTask<Integer> futureTask = new FutureTask<>(callable); for(i = 0; i < 100; i++){ System.out.println(Thread.currentThread().getName() + " " + i); if (i == 5) { new Thread(futureTask).start(); new Thread(futureTask).start(); } } try { System.out.println("futureTask ruturn: " + futureTask.get()); } catch (Exception e) { e.printStackTrace(); } } }
次に、Javaでマルチスレッドを実装するいくつかの方法について詳しく説明します
Threadから継承した方法1
public class ThreadExtendsThread extends Thread { private int i; @Override public void run() { for(; i < 100; i++) { System.out.println(getName() + " " + i); } } }
runメソッドはスレッドの実行本体であり、ThreadExtendsThreadオブジェクトはスレッドオブジェクト。
方法2、Runnableインターフェースを実装します
public class ThreadImplementsRunnable implements Runnable { private int i; @Override public void run() { for(; i < 100; i++){ System.out.println(Thread.currentThread().getName() + " " + i); } } }
runメソッドはスレッドの実行本体であり、使用される場合は、新しいThreadオブジェクトが使用され、RunnableオブジェクトがターゲットとしてThreadオブジェクトに渡されます。また、同じ Runnable オブジェクトを複数のスレッドのターゲットとして使用でき、これらのスレッドはすべて Runnable オブジェクトのインスタンス変数を共有します。
方法 3、Callable インターフェイスの実装
import java.util.concurrent.Callable; public class ThreadImplementsCallable implements Callable<Integer> { private int i; @Override public Integer call() throws Exception { for(; i < 100; i++){ System.out.println(Thread.currentThread().getName() + " " + i); } return i; } }
Callable インターフェイスは Runnable インターフェイスに似ていますが、他のインターフェイスよりも強力です。スレッドの実行本体は、戻り値を持ち、例外をスローできる call メソッドです。使用する場合は、Callable オブジェクトを FutureTask オブジェクトにラップし、ジェネリックを通じて戻り値の型を指定します。後で FutureTask の get メソッドを呼び出して、実行結果を取得できます。
マルチスレッドを実装するその他の Java メソッドについては、PHP 中国語 Web サイトに関連記事の概要が掲載されていますので、ご注意ください。