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();
    }
    }
    }
    }
  • 相关阅读:
    bzoj2683简单题 cdq分治
    bzoj3963[WF2011]MachineWorks cdq分治+斜率优化dp
    bzoj1767[Ceoi2009]harbingers 斜率优化dp
    bzoj2753[SCOI2012]滑雪与时间胶囊 最小生成树
    bzoj1492[NOI2007]货币兑换Cash cdq分治+斜率优化dp
    刷题总结——pole(uva 1638 dp)
    刷题总结——分配笔名(51nod1526 trie树)
    刷题总结——树有几多愁(51nod1673 虚树+状压dp+贪心)
    刷题总结——book of evil(codefoeces 337D)
    刷题总结——解方程(NOIP2014)
  • 原文地址:https://www.cnblogs.com/jtjs1989/p/3527236.html
Copyright © 2011-2022 走看看