加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Thread.join()等效于执行器

发布时间:2020-12-14 05:23:40 所属栏目:Java 来源:网络整理
导读:我有一个新手的问??题.我有这个代码: public class Main { public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub IntHolder aHolder=new IntHolder(); aHolder.Number=0; IncrementorThread A= new I
我有一个新手的问??题.我有这个代码:
public class Main 
{

    public static void main(String[] args) throws InterruptedException 
    {
        // TODO Auto-generated method stub
        IntHolder aHolder=new IntHolder();
        aHolder.Number=0;

        IncrementorThread A= new IncrementorThread(1,aHolder);
        IncrementorThread B= new IncrementorThread(2,aHolder);
        IncrementorThread C= new IncrementorThread(3,aHolder);

        A.start();
        B.start();
        C.start();

        A.join();
        B.join();
        C.join();
        System.out.println("All threads completed...");

    }

}

这将等待所有线程完成.如果我这样使用Executors:

public class Main 
{

    public static void main(String[] args) 
    {
        // TODO Auto-generated method stub
        IntHolder aHolder=new IntHolder();
        aHolder.number=0;

        IncrementalRunable A= new IncrementalRunable(1,aHolder);
        IncrementalRunable B= new IncrementalRunable(2,aHolder);
        IncrementalRunable C= new IncrementalRunable(3,aHolder);

        ExecutorService exec = Executors.newFixedThreadPool(3);
        exec.execute(A);
        exec.execute(B);
        exec.execute(C);
        //Don't know what to do here

        System.out.println("All threads completed...");
    }
}

如何暂停主线程等待执行器中的所有线程完成,即所有线程完成工作后都应该打印“所有线程完成…”?

解决方法

executor.shutdown();
while (!executor.awaitTermination(24L,TimeUnit.HOURS)) {
    System.out.println("Not yet. Still waiting for termination");
}

使用shutdown()awaitTermination()组合.

编辑:

基于@Lital的评论

List<Callable<Object>> calls = new ArrayList<Callable<Object>>();
calls.add(Executors.callable(new IncrementalRunable(1,aHolder)));
calls.add(Executors.callable(new IncrementalRunable(2,aHolder)));
calls.add(Executors.callable(new IncrementalRunable(3,aHolder)));

List<Future<Object>> futures = executor.invokeAll(calls);

注意:所有的任务完成(通过失败或完成成功执行),invokeAll()将不会返回.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读