Java スレッドプールの非同期呼び出しを実装する方法を教えてください

Javaスレッドプールを使って非同期呼び出しを実装するには、次のステップが必要になります。

  1. Executors クラスが提供する newFixedThreadPool や newCachedThreadPool などの静的メソッドを使用して、さまざまな種類の ThreadPool オブジェクトを作成できます。
  2. 実行結果を返せるRunnableインターフェイスに類するCallableインターフェイスを実装したTaskクラスを作成します。
  3. スレッドプールにタスクを投げ込んで実行する時には、submitメソッドを使ってタスクを投げ込むことができます。submitメソッドにはFutureオブジェクトが返され、このFutureオブジェクトを使えばタスクの実行結果を取得できます。
  4. 実行結果を取得する必要がある箇所で、Futureオブジェクトのgetメソッドを呼び出してタスク実行の結果を取得する。getメソッドは、タスクが完了し結果が返るまで現在のスレッドをブロックする。

ネイティブな日本語で言い換える例を1つ提示します:

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class ThreadPoolAsyncCall {
public static void main(String[] args) throws InterruptedException, ExecutionException {
// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(5);
// 创建任务
MyTask myTask = new MyTask();
// 提交任务
Future<String> future = executorService.submit(myTask);
// 执行其他操作
// 获取任务执行结果
String result = future.get();
System.out.println("任务执行结果:" + result);
// 关闭线程池
executorService.shutdown();
}
}
class MyTask implements Callable<String> {
@Override
public String call() throws Exception {
// 模拟耗时操作
Thread.sleep(2000);
return "任务执行完成";
}
}

上記の例では、サイズは5の固定スレッドプールを作成し、その後にMyTaskというCallableインターフェースを実装したタスククラスを作成しました。タスクの実行後に文字列が返されます。作成したタスクをスレッドプールにサブミットし、Futureオブジェクトを介して実行結果を取得します。最後に、スレッドプールを終了します。

bannerAds