JDKのExectorServiceとCallableとFutureのスレッドへのサポート
2671 ワード
JDKのExectorServiceとCallableとFutureのスレッドへのサポート
1、コードの背景:
Thread 1、Thread 2、Thread 3、Thread 4の4つのスレッドがそれぞれC、D、E、Fの4つのディスクの大きさを統計している場合、すべてのスレッドは統計済みで、Thread 5スレッドにまとめられていますが、どうすればいいですか?
2、コード:
「皿」サイズのコードを統計して、ここでjdkのCallableインターフェースを実現します。
1、コードの背景:
Thread 1、Thread 2、Thread 3、Thread 4の4つのスレッドがそれぞれC、D、E、Fの4つのディスクの大きさを統計している場合、すべてのスレッドは統計済みで、Thread 5スレッドにまとめられていますが、どうすればいいですか?
2、コード:
「皿」サイズのコードを統計して、ここでjdkのCallableインターフェースを実現します。
package com.wang.test.concurrent;
import java.util.concurrent.Callable;
public class Task1 implements Callable<Integer> {
private int x;
private int y;
public Task1(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public Integer call() throws Exception {
return x*y;
}
}
集計したコードも、jdkのCallableインターフェースを実現し、
package com.wang.test.concurrent;
import java.util.concurrent.Callable;
public class Task2 implements Callable<Integer> {
private int x;
private int y;
private int q;
private int w;
public Task2(int x, int y, int q, int w) {
this.x = x;
this.y = y;
this.q = q;
this.w = w;
}
@Override
public Integer call() throws Exception {
return x + y + q + w;
}
}
クライアント:JDKにおいてExectors.newFixedThreadPool方法を用いてExectorServiceを作成し、ExectorServiceのsubmit方法でCallableインターフェースを受信すると、JDK内部はスレッド処理となり、Futreを用いてsubmitメソッドの戻り値を受信し、futureが呼び出された時に、スレッドがまだ実行されていない場合は、プログラムが停止します。
package com.wang.test.concurrent;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Client {
public static void main(String[] args) throws Exception {
ExecutorService pool = Executors.newFixedThreadPool(4);
Task1 t1 = new Task1(1,2);
Task1 t2 = new Task1(23,34);
Task1 t3 = new Task1(23,456);
Task1 t4 = new Task1(3,33);
Future<Integer> f1 = pool.submit(t1);
Future<Integer> f2 = pool.submit(t2);
Future<Integer> f3 = pool.submit(t3);
Future<Integer> f4 = pool.submit(t4);
//Future get , ,
Task2 t5 = new Task2(f1.get(), f2.get(), f3.get(), f4.get());
Future<Integer> f5 = pool.submit(t5);
System.out.println(f5.get());
pool.shutdown();
}
}
疑問があれば、メッセージをお願いします。あるいは、当駅のコミュニティで交流して討論してください。ありがとうございます。