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();
    }
    }
    }
    }
  • 相关阅读:
    线程互斥与同步
    JSP中传递数据出现的乱码问题
    JavaWeb学习——获取类路径下的资源
    Java初始化顺序
    Socket网络编程
    算法练习--LeetCode--17. Letter Combinations of a Phone Number
    算法练习--LeetCode--29. Divide Two Integers
    XCode10 swift4.2 适配遇到的坑
    leetCode :103. Binary Tree Zigzag Level Order Traversal (swift) 二叉树Z字形层次遍历
    iOS 拼音 Swift K3Pinyin
  • 原文地址:https://www.cnblogs.com/jtjs1989/p/3527236.html
Copyright © 2011-2022 走看看