问题3:(多线程环境)主线程等待所有子线程执行完毕再执行

方法很多,方法1:可以使用线程池的方法,方法2:也可以轻量级的创建多个Thread,再结合CountDownLatch来完成线程统一。先尝试简单有效的 方法2

    //多线程获取ping不同的设备ip
public List<String> getUnreachedIp(final ArrayList<String> list) {
    final List<String> arrayList = Collections.synchronizedList(new ArrayList<String>());
    
    int ipTotal = list.size();
    int threads = 4;
    final int avg = ipTotal / threads;
    //List<Thread> listThreads = new ArrayList<>();
    final CountDownLatch latch = new CountDownLatch(threads);
    for (int i = 0; i < threads; i++) {
        //4个线程处理ping
        final int count = i;
        new Thread(){
            @Override
            public void run() {
                for (int j = 0; j < avg; j++) {
                    int number = j + count * avg;
                    if (!PingUtils.isReachIp(list.get(number))) {
                        arrayList.add(list.get(number));
                    }
                }
                latch.countDown();
            }
        }.start();
    }
    try {
        latch.await();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return arrayList;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺...
    OmaiMoon阅读 1,719评论 0 12
  • 线程池ThreadPoolExecutor corepoolsize:核心池的大小,默认情况下,在创建了线程池之后...
    irckwk1阅读 777评论 0 0
  • 1. cpu通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一任务。但是,再切换之前会保存上一...
    冰与河豚鱼阅读 684评论 0 0
  • 文写给现在的自己,意激励未来的自己。。。。。。 ——加油吧...
    __徒者阅读 247评论 0 2
  • 来到简书的第一天车速是不是有点快 (滑稽) 小标题:如梦似幻,造化弄人 人的潜力无穷的,人没有意识到自己的能力,是...
    宣归阅读 1,233评论 0 0