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インターフェースを実現します。

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(); 
  } 
} 

疑問があれば、メッセージをお願いします。あるいは、当駅のコミュニティで交流して討論してください。ありがとうございます。