Java でマルチスレッドを実装する方法: (推奨: java ビデオ チュートリアル)
方法 1: Thread クラスを継承する
1. Thread クラスを継承するサブクラスを作成します
2. Thread クラスの run() を書き換えます: run() でこのスレッドによって実行される操作を宣言します
3. Thread のサブクラスのオブジェクトを作成します
4. このオブジェクトの start() を呼び出します: ① スレッドを開始します ② 現在のスレッドの run() メソッドを呼び出します
方法 2: Runnable インターフェイスの実装方法
1. Runnable インターフェイスを実装するクラスを作成します
2. Runnable インターフェイスに抽象メソッドを実装します: run(): will create スレッドによって実行される操作はこのメソッドで宣言されます
3. Runnable インターフェイス実装クラスのオブジェクトを作成します
4. このオブジェクトをThread クラスのコンストラクターにパラメータを指定して、Thread クラス Object
5 を作成します。Thread クラスで start() を呼び出します: ① スレッドを開始します。 ② スレッドの run() を呼び出します --->Call Runnable インターフェース実装クラスの run()
#次の 2 つのメソッドが jdk1.5 で追加されました。
方法 3: Callable インターフェイスを実装する
手順:
1. Runnable を使用する場合と比較して、Callable はより強力です
2. run() メソッドと比較して、実装された call() メソッドは値を返すことができます
#3. このメソッドは例外をスローすることができます#4. 汎用の戻り値をサポート
# 5. 返された結果の取得など、FutureTask クラスを使用する必要があります Future インターフェイスは、特定の Runnable タスクおよび Callable タスクの実行結果のキャンセル、完了したかどうかのクエリ、結果の取得などを行うことができます。 FutureTask は、Future インターフェイスの唯一の実装クラスであり、Runnable インターフェイスと Future インターフェイスも実装します。 Runnable としてスレッドによって実行でき、Callable の戻り値を取得する Future としても使用できます。方法 4: スレッド プールを使用します
手順:
事前に複数のスレッドを作成し、スレッド プールに入れ、使用するときに直接取得し、使用後はプールに戻します。頻繁な作成と破壊を回避し、再利用を実現します。生活における公共交通機関と同じです。 利点:1. 応答速度の向上 (新しいスレッドの作成時間の短縮)#2. リソース消費の削減 (スレッド プール内のスレッドを再利用するため、スレッドを再利用する必要がありません)毎回作成)
3. スレッド管理を容易にする
例:
import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.FutureTask; import java.util.concurrent.ThreadPoolExecutor; //方式一 class ThreadTest extends Thread { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + ":" + i); } } } // 方式二 class RunnableTest implements Runnable { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + ":" + i); } } } // 方式三 class CallableTest implements Callable<Integer> { @Override public Integer call() throws Exception { int sum = 0; for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + ":" + i); sum += i; } return sum; } } // 方式四 class ThreadPool implements Runnable { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + ":" + i); } } } public class Test { public static void main(String[] args) { // 继承Thread ThreadTest thread = new ThreadTest(); thread.setName("方式一"); thread.start(); // 实现Runnable RunnableTest runnableTest = new RunnableTest(); Thread thread2 = new Thread(runnableTest, "方式二"); thread2.start(); // 实现Callable<> 有返回值 CallableTest callableTest = new CallableTest(); FutureTask<Integer> futureTask = new FutureTask<>(callableTest); new Thread(futureTask, "方式三").start(); // 返回值 try { Integer integer = futureTask.get(); System.out.println("返回值(sum):" + integer); } catch (Exception e) { e.printStackTrace(); } // 线程池 ExecutorService pool = Executors.newFixedThreadPool(10); ThreadPoolExecutor executor = (ThreadPoolExecutor) pool; /* * 可以做一些操作: * corePoolSize:核心池的大小 * maximumPoolSize:最大线程数 * keepAliveTime:线程没任务时最多保持多长时间后会终止 */ executor.setCorePoolSize(5); // 开启线程 executor.execute(new ThreadPool()); executor.execute(new ThreadPool()); executor.execute(new ThreadPool()); executor.execute(new ThreadPool()); } }
Java の詳細については、
Java 基本チュートリアル列に注目してください。 。
以上がJavaマルチスレッドを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。