import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* Java线程:有返回值的线程
* @author <a href="http://git.oschina.net/denger"> 羊登琼 </a>
*/
public class CallableTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
int threadNum = 4;
// 创建一个线程池
ExecutorService pool = Executors.newCachedThreadPool();
// // 创建两个有返回值的任务
// Callable c1 = new MyCallable("A");
// Callable c2 = new MyCallable("B");
//
// // 执行任务并获取Future对象
// Future f1 = pool.submit(c1);
// Future f2 = pool.submit(c2);
//
// // 从Future对象上获取任务的返回值,并输出到控制台
// System.out.println(">>>" + f1.get().toString());
// System.out.println(">>>" + f2.get().toString());
/**
* 表示各个线程返回结果的总和
*/
int count = 0;
int waitTime = 10;
/**
* 存放线程结果的对象,为了让main线程循环询问子线程结果,进行等待
*/
List<Future<Integer>> futures = new ArrayList<>();
// 创建4个线程
for (int i = 0; i < threadNum; i++) {
MyCallable c1 = new MyCallable("" + i, 400);
Future<Integer> future = pool.submit(c1);
futures.add(future);
}
// 进行判断线程是否结束,目的是让main主线程等待子线程
boolean isDone = false;
for (Future<Integer> future : futures) {
do {
isDone = future.isDone();
if (isDone) {
count = count + future.get();
} else {
// 等待两秒,因为它一直询问,执行者很烦,我觉得效率会耽误执行者
System.out.printf("main主线程进行等待...%s毫秒(ms)\n", waitTime);
Thread.sleep(waitTime);
}
} while (!isDone);
isDone = false;
}
// 线程阻塞结束
System.out.println(String.format("总共执行%s", count));
// 关闭线程池
pool.shutdown();
}
}
/**
* 线程类
* @author <a href="http://git.oschina.net/denger"> 羊登琼 </a>
*/
class MyCallable implements Callable<Integer> {
/**
* 存放变量
*/
private String oid;
/**
* 循环次数代表业务处理
*/
private Integer length = 400;
MyCallable(String oid, Integer length) {
this.oid = oid;
this.length = length;
}
@Override
public Integer call() throws Exception {
for (int i = 0; i < length; i++) {
System.out.println(String.format("%s_____线程的任务_____%s", oid, i));
}
return length;
}
}
以后有需要的时候回来参考一下,脑袋再好也没有笔记好