论坛首页 Java企业应用论坛

线程池同步的解决办法

浏览 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循环很正常怪呀,不知道是什么原因,怪。

   发表时间:2009-10-09  
这些方法都不是很好,阻塞线程要用barrier!
即:java.util.concurrent.CyclicBarrier。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics