zoukankan      html  css  js  c++  java
  • java多线程执行时主线程的等待

    1、通过thread.join()方式,注意:如果有多个子线程,需要将全部的线程先start,然后再join。代码示例如下:

    public class Main 

        public static void main(String[] args) 
        { 
            long start = System.currentTimeMillis(); 
             
            List<Thread> list = new ArrayList<Thread>(); 
            for(int i = 0; i < 5; i++) 
            { 
                Thread thread = new TestThread(); 
                thread.start(); 
                list.add(thread); 
            } 
            try 
            { 
                for(Thread thread : list) 
                { 
                    thread.join(); 
                } 
            } 
            catch (InterruptedException e) 
            { 
                e.printStackTrace(); 
            } 
             
            long end = System.currentTimeMillis(); 
            System.out.println("子线程执行时长:" + (end - start)); 
        } 

    2、主线程等待多个子线程(CountDownLatch实现)

    CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

    主要方法

     public CountDownLatch(int count);

     public void countDown();

     public void await() throws InterruptedException
     

    构造方法参数指定了计数的次数

    countDown方法,当前线程调用此方法,则计数减一

    await方法,调用此方法会一直阻塞当前线程,直到计时器的值为0

    示例代码如下:

    public class CountDownLatchDemo {
    final static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public static void main(String[] args) throws InterruptedException {
    CountDownLatch latch=new CountDownLatch(2);//两个工人的协作
    Worker worker1=new Worker("zhang san", 5000, latch);
    Worker worker2=new Worker("li si", 8000, latch);
    worker1.start();//
    worker2.start();//
    latch.await();//等待所有工人完成工作
    System.out.println("all work done at "+sdf.format(new Date()));
    }
    
    static class Worker extends Thread{
    String workerName; 
    int workTime;
    CountDownLatch latch;
    public Worker(String workerName ,int workTime ,CountDownLatch latch){
    this.workerName=workerName;
    this.workTime=workTime;
    this.latch=latch;
    }
    public void run(){
    System.out.println("Worker "+workerName+" do work begin at "+sdf.format(new Date()));
    doWork();//工作了
    System.out.println("Worker "+workerName+" do work complete at "+sdf.format(new Date()));
    latch.countDown();//工人完成工作,计数器减一
    
    }
    
    private void doWork(){
    try {
    Thread.sleep(workTime);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    }
  • 相关阅读:
    目录和文件的权限设置方法
    logstash5 单实例多配置文件实现
    elasticsearch 使用快照方式迁移数据
    mysql 主库有数据通过锁库做主从
    mfs挂载
    web页面性能分析一些网址
    centos7 ffmpeg安装
    (转)在 Windows 上安装Rabbit MQ 指南
    (转)TeamCity配置笔记
    (转)分布式缓存GemFire架构介绍
  • 原文地址:https://www.cnblogs.com/jtjs1989/p/3527236.html
Copyright © 2011-2022 走看看