浏览 3031 次
锁定老帖子 主题:线程池同步的解决办法
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-29
最后修改:2009-01-04
jdk1.5的threadpoolexecutor ,要在任务全部处理完后在接着做别的事情,这就涉及同步的做法了,有2种办法:
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 20,0, TimeUnit.SECONDS, new ArrayBlockingQueue(10), new ThreadPoolExecutor.DiscardOldestPolicy()); for (int i = 0; i < 10; i++) { executor.submit(new ThdRun(i)); } executor.shutdown(); try { executor.awaitTermination(100, TimeUnit.DAYS); } catch (Exception e) { e.printStackTrace(); } System.out.println("finish!"); 输出结果为: 0 1 2 3 5 6 7 8 9 4 finish!
还一种做法就是:
ExecutorService executor = Executors.newFixedThreadPool(3); for (int i = 0; i < 10; i++) { executor.submit(new ThdRun(i)); } executor.shutdown(); try { executor.awaitTermination(100, TimeUnit.DAYS); } catch (Exception e) { e.printStackTrace(); } System.out.println("finish!");
也能达到同样的效果. 不过这两种方法还是的不同,如果run方法里面耗时长的(比如io)话。方法一任务就没有全部处理完,比如我拷贝50个文件,结果直拷贝了30几个,但是我用了个耗时长的while循环很正常怪呀,不知道是什么原因,怪。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-10-09
这些方法都不是很好,阻塞线程要用barrier!
即:java.util.concurrent.CyclicBarrier。 |
|
返回顶楼 | |