packageliuzh;importjava.util.LinkedList;importjava.util.List;importjava.util.concurrent.Callable;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.Future;importjava.util.concurrent.LinkedBlockingDeque;importjava.util.concurrent.ThreadPoolExecutor;importjava.util.concurrent.TimeUnit;class Task implements Callable{privateString filename;publicTask(String filename) {this.filename =filename;
}
@Overridepublic String call() throwsException {try{
Thread.sleep(1000);
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("完成 "+filename);return "返回值" +filename;
}
}/*** 创建一个线程池,将50个任务分配进去,并发量最大为5
* 运行结束后,输出每个线程返回的结束
* title:ThreadPoolExecutorTest
* descript:
*@authorliuzh
* @date 2016年5月18日 下午8:16:26*/
public classThreadPoolExecutorTest {public void start() throwsInterruptedException, ExecutionException {/*** 创建线程池,并发量最大为5
* LinkedBlockingDeque,表示执行任务或者放入队列*/ThreadPoolExecutor tpe= new ThreadPoolExecutor(5, 10, 0,
TimeUnit.SECONDS,new LinkedBlockingDeque(),newThreadPoolExecutor.CallerRunsPolicy());//存储线程的返回值
List> results = new LinkedList>();for (int i = 0; i < 10; i++) {
Task task= newTask(String.valueOf(i));
System.out.println("放入线程池:" +i);//调用submit可以获得线程的返回值
Future result =tpe.submit(task);
results.add(result);
}//此函数表示不再接收新任务,//如果不调用,awaitTermination将一直阻塞
tpe.shutdown();//1天,模拟永远等待
System.out.println(tpe.awaitTermination(1, TimeUnit.DAYS));//输出结果
for (int i = 0; i < 10; i++) {
System.out.println(results.get(i).get());
}
}public static void main(String[] args) throwsInterruptedException, ExecutionException {
ThreadPoolExecutorTest test= newThreadPoolExecutorTest();
test.start();
}
}