--------------------20180502更新-----------------------------
今天学习到了一个比较强大的类:ExecutorCompletionService,它是将 Executor和BlockQueue结合的jdk类,其实现的主要目的是:提交任务线程,每一个线程任务直线完成后,将返回值放在阻塞队列中,然后可以通过阻塞队列的take()方法返回 对应线程的执行结果!!
所以还可以这样写:
ExecutorCompletionService<String> completionService = new ExecutorCompletionService(Executors.newFixedThreadPool(5));
for(int i=0; i<10; i++) {
int j = i;
completionService.submit(()-> Thread.currentThread().getName() + "------>" + j);
}
try {
for(int i=0; i<10; i++) {
Future<String> future = completionService.take();
if(future != null) {
String str = future.get();
System.out.println(str);
}
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("---------->结束");
同样可以达到阻塞的效果!(注:其中有用到jdk1.8的lambda表达式~)
---------------------------------------------------------------------------------------------------------
之前我有写过一篇博客,是关于多线程写同一个sheet文件的。类似的场景很多,当我们想用多线程提高效率时,面临的关键问题就是线程安全和确定所有任务都完成。线程安全的问题那篇博客有说,就是确保对公共资源的写操作是安全的,比如List的add操作采用synchronized来包装或直接采用线程安全的集合;Sheet的addRow加锁等… 而本篇的重点是“如何确保所有任务都完成,才能进行下一步?”。
先来看现象:
public static void m() {
for(int i=0; i<