必要性が要約されているタスクで複数のスレッドのメインスレッド同時実行を開き、実行し、最終結果の各スレッドによって収集された結果を返すために、あなたは呼び出し可能インターフェースを必要としています。
今ミカの方法は:作成し、クラスの呼び出し可能インターフェース、ロジック呼び出し、特定の演算処理を実施し、結果を返します。
特定の呼び出し手順は:スレッドプールを作成し、今後の一覧とスレッドプールを使用して提出したタスクの返された結果を受け取る呼び出し可能スレッドミカ患者と将来に保存されているスレッドの実行後の結果、スレッドの実行の最後にトラバーサル将来一覧今後のオブジェクトは、スレッドがデータ呼び出し可能なタスク戻り、要約結果を得ることができているオブジェクトのgetメソッドを呼び出します。
例:
import java.util.concurrent.Callable;
/**
* ① 通过Callable接口创建MyCallable线程
*/
public class MyCallable implements Callable<String> {
private String name;
/**
* 通过构造器为线程传递参数,以定义线程的名称
* @param name
*/
public MyCallable(String name){
this.name = name;
}
/**
* Computes a result, or throws an exception if unable to do so.
*
* @return computed result
* @throws Exception if unable to compute a result
*/
@Override
public String call() throws Exception {
return name;
}
}
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* 测试MyCallable
*/
public class TestMyCallable {
public void test() {
// ② 创建一个固定大小为7的线程
ExecutorService pool = Executors.newFixedThreadPool(6);
// ③ 创建多个有返回值的任务列表list
List<Future> taskList = new ArrayList<Future>();
for(int i = 0; i < 6; i++ ){
// ④创建一个有返回值的线程実例
Callable c = new MyCallable(i + " ");
// ⑤提交线程,获取Future对象并将其保存到Future List 中
Future future = pool.submit(c);
System.out.println("Submit a callable thread: "+i);
taskList.add(future);
}
// ⑥ 关闭线程池,等待线程执行结束
pool.shutdown();
// ⑦ 遍历所有线程的运行结果
taskList.forEach(future -> {
//从Future对象中获取任务返回值,并将结果输出于控制台。
System.out.println("Get the resullt from callable thread: " +
futureGet(future)
);
});
}
private <E extends Exception> String futureGet(Future future) throws E{
try {
return future.get().toString();
} catch (Exception e) {
throw (E) e;
}
}
}