java 多线程 , 等待所有子线程都执行完后 , 在执行主线程(其中的一种 , 也是个人觉得最好用的一种)

 public static void main(String[] args) throws InterruptedException {

        // Runtime.getRuntime().availableProcessors()  获取可用的cpu数量
        int count = Runtime.getRuntime().availableProcessors();

        //创建一个指定线程数量的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(count);

        /**
         * CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。
         * 每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,
         * 它表示所有的线程已经完成了任务
         */
        CountDownLatch downLatch = new CountDownLatch(count);

        for (int i = 0; i <count ; i++) {
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName());
                    downLatch.countDown();//计数器减 1
                }
            });
        }

        /**
         * 如果计数器不为0的话 , 主线程会进入阻塞状态
         * timeout : 5 表示最大超时时间
         * TimeUnit.SECONDS  表示以秒为单位计算的
         * 返回值 , 如果downLatch 计数器不为0的话,就是false ,反之true
         * 它还有一个无参的 downLatch.await(),如果计数器不为0 , 会一直阻塞 , 没有超时时间
         */
        boolean await = downLatch.await(5, TimeUnit.SECONDS);

        System.out.println(await);

        //downLatch.getCount() 获取剩余的数量
        System.out.println(downLatch.getCount());

        System.out.println("主线程执行:=>"+Thread.currentThread().getName());

    }

原文地址:https://www.cnblogs.com/dmxk/p/11634466.html

时间: 2024-11-06 20:06:21

java 多线程 , 等待所有子线程都执行完后 , 在执行主线程(其中的一种 , 也是个人觉得最好用的一种)的相关文章

iOS AFNetWorking中block执行完后再执行其它操作

需求:同时进行两次网络请求,网络请求是异步的,在网络请求成功后进行其它的操作.两个网络请求是这样,一个网络请求中block执行完之后,再进行其它操作,也是一样的原理,只是这时候不需要线程组了,只需要信号量.当然也适用于所有的block. 接下来就说下,在两次异步请求之后要做的操作. 利用线程组和信号量来完成,看代码 - (void)getData { NSString *appIdKey = @"8781e4ef1c73ff20a180d3d7a42a8c04"; NSString*

用一个bat文件调用另外两个bat文件,当1.bat执行完后再执行2.bat

摘自:https://zhidao.baidu.com/question/492732911.html @echo off start d:\1.bat start c:\2.bat 这样是2个任务同时执行,应该怎么改,谢谢 1 2 3 4 5 6 7 8 9 @echo off start /wait d:\1.bat start /wait c:\2.bat   @echo off call d:\1.bat call c:\2.bat start 是在新窗口运行调用的文件,call是在当前

Java多线程之 -- 进程和线程

Java多线程之 – 进程和线程 概念 进程 程序的动态执行过程 包括占用的资源(内存.CPU)和线程 线程 线程是程序中最小的执行单位 一个进程有多个线程 线程共享进程的资源 进程和线程的区分 我们可以想象为进程为班级而线程是邦奇中得每一个学生 线程之间的交互 互斥,类似于每一个学生都为了第一名而你争我让,线程也是,都想抢占CPU的资源 同步,当举行运动会的时候,大家都团结一心,彼此共享自己的资源 Thread.Runnable Thread Introduction Thread 是Java

Java多线程--让主线程等待所有子线程执行完毕

数据量很大百万条记录,因此考虑到要用多线程并发执行,在写的过程中又遇到问题,我想统计所有子进程执行完毕总共的耗时,在第一个子进程创建前记录当前时间用System.currentTimeMillis()在最后一个子进程结束后记录当前时间,两次一减得到的时间差即为总共的用时,代码如下 Java代码   long tStart = System.currentTimeMillis(); System.out.println(Thread.currentThread().getName() + "开始&

Java多线程、主线程等待所有子线程执行完毕、共享资源

1.Java创建与启动线程 Java提供两种方式创建和启动线程:1.直接Thread类,2.实现Runable接口. 1.1  继承Thread类 public class myThread extends Thread { public void run(){ for(int i=0;i<5;i++){ System.out.println(this.getName()+":"+i); } } public static void main(String[] args){ //

Java多线程--让主线程等待所有子线程执行完毕 join

首先从公司一道笔试题开始 1 package test; 2 3 public class Test implements Runnable { 4 5 public int i = 0; 6 7 @Override 8 public void run() { 9 try { 10 Thread.sleep(1000); 11 } catch (InterruptedException e) { 12 // TODO Auto-generated catch block 13 e.printSt

java主线程等待所有子线程执行完毕在执行(常见面试题)

java主线程等待所有子线程执行完毕在执行(常见面试题) java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个处理都可以用一个线程来执行,所有处理完成了之后才会返回给用户下单成功,下面就说一下我能想到的方法,欢迎大家批评指正: 用sleep方法,让主线程睡眠一段时间,当然这个睡眠时间是主观的时间,是我们自己定的,这个方法不推荐,但是在这里还是写一下,毕竟是解决方法 2.使用Thread的join()等待所有

Java主线程等待所有子线程执行完毕再执行解决办法集

Java主线程等待所有子线程执行完毕在执行,其实在我们的工作中经常的用到,比如说主线程要返回一个响应用户的值,但这个值得赋值过程是由过个子线程来完成的(模拟一个实际开发的情景),所以主线程必须等待子线程执行完毕,再响应用户:否则,响应用户的是一个无意义的值. 那么如何确保所有的子线程执行完毕了.一般的有如下方法: 1  让主线程等待,或着睡眠几分钟.用Thread.sleep()或者TimeUnit.SECONDS.sleep(5); 如下: package andy.thread.tradit

主线程等待所有子线程执行完成之后再继续往下执行的解决方案

问题背景: 目前需要解析十多个Excel文件并将数据导入到数据库,文件导出完成之后还有后续步骤需要处理,例如更新批次状态. 如果采用单线程的方式顺序去处理每个文件的话,感觉有点慢,虽说不算是特别慢,但是由于用户需要等待导入结果, 考虑到用于体验问题,因此需要坐下性能优化.既然是性能优化,基本都是考虑到使用多线程并发处理.但是多线线程有个问题, 就是启动多个线程后,如何让当前线程等待这些子线程执行完毕,因为需要根据所以子线程的执行结果来更新批次状态 解决方案1: 基本思路是这样: 每个SubThr