Java中八线程同步类 CountDownLatch

发布时间:2019-05-17  栏目:MySQL  评论:0 Comments

看似倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减壹,当达到0时,全部等待者就起来施行。

在多线程开荒中,平日境遇希望1组线程实现今后在进行之后的操作,java提供了一个多线程同步支持类,能够成功此类须要:
类广西中国广播公司泛的措施:
图片 1
当中构造方法:CountDownLatch(int count)
参数count是计数器,一般用要实践线程的数码来赋值。
long getCount():得到当前计数器的值。
void
countDown():当计数器的值大于零时,调用方法,计数器的数值减少一,当计数器等数零时,释放具备的线程。
void await():调所该方式阻塞当前主线程,直到计数器减弱为零。
代码例子:
线程类:

java.util.concurrent.CountDownLatch
一个同步补助类,在成就一组正在其他线程中施行的操作此前,它同意贰个或四个线程平昔守候。用给定的计数开始化CountDownLatch。由于调用了countDown()方法,所以在当前计数达到零在此以前,await方法会一向受阻塞。之后,会放出具备等待的线程,await的有所继续调用都将及时回去。这种地方只出现一遍——计数不可能被复位。借使急需重新设置计数,请思考采用CyclicBarrier。

import java.util.concurrent.CountDownLatch;
public class TestThread extends Thread{
CountDownLatch cd;
String threadName;
public TestThread(CountDownLatch cd,String threadName){
    this.cd=cd;
    this.threadName=threadName;

}
@Override
public void run() {
    System.out.println(threadName+" start working...");
    dowork();
    System.out.println(threadName+" end working and exit...");
    cd.countDown();//告诉同步类完成一个线程操作完成

}
private void dowork(){
    try {
        Thread.sleep(2000);
        System.out.println(threadName+" is working...");
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}

}

CountDownLatch是一个通用同步工具,它有数不尽用场。将计数壹开始化的CountDownLatch用作2个简单的开/关锁存器,或进口:在经过调用countDown()的线程张开入口前,所有调用await的线程都间接在入口处等待。用N开端化的
CountDownLatch能够使八个线程在N个线程完结某项操作在此之前一贯等候,只怕使其在某项操作实现N次在此之前一向等候。

测试类:

CountDownLatch的一个有用特色是,它不供给调用countDown方法的线程等到计数到达零时才持续,而在拥有线程都能由此事先,它只是阻止任何线程继续通过贰个await。

import java.util.concurrent.CountDownLatch;
public class TsetCountDownLatch {

    public static void main(String[] args) {
        try {
            CountDownLatch cd = new CountDownLatch(3);// 表示一共有三个线程
            TestThread thread1 = new TestThread(cd, "thread1");
            TestThread thread2 = new TestThread(cd, "thread2");
            TestThread thread3 = new TestThread(cd, "thread3");
            thread1.start();
            thread2.start();
            thread3.start();
            cd.await();//等待所有线程完成
            System.out.println("All Thread finishd");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

图片 2

出口结果:

比喻:四个选手等待宣判命令:评判等全部选手到齐后发布结果

    thread1 start working...
    thread2 start working...
    thread3 start working...
    thread2 is working...
    thread2 end working and exit...
    thread1 is working...
    thread3 is working...
    thread3 end working and exit...
    thread1 end working and exit...
    All Thread finishd
package com.ljq.test.thread;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CountdownLatchTest {

  public static void main(String[] args) {
    ExecutorService service = Executors.newCachedThreadPool();
    //裁判发布命令的计数器,计数器为0,运动员就跑
    final CountDownLatch cdOrder = new CountDownLatch(1);
    //运动员跑到终点的计数器,为0裁判宣布结果
    final CountDownLatch cdAnswer = new CountDownLatch(3); 

    //产生3个运动员
    for(int i=0;i<3;i++){
      Runnable runnable = new Runnable(){
          public void run(){
          try {
            System.out.println("线程" + Thread.currentThread().getName() + "正准备接受命令");            
            cdOrder.await();
            System.out.println("线程" + Thread.currentThread().getName() + "已接受命令");               
            Thread.sleep((long)(Math.random()*10000)); 
            System.out.println("线程" + Thread.currentThread().getName() + "回应命令处理结果");           
            cdAnswer.countDown();           
          } catch (Exception e) {
            e.printStackTrace();
          }       
        }
      };
      service.execute(runnable); //运动员开始任务
    }   


    try {
      //裁判休息一会 再发布命令
      Thread.sleep((long)(Math.random()*10000));

      System.out.println("线程" + Thread.currentThread().getName() + "即将发布命令");          
      cdOrder.countDown(); //命令计数器置为0,发布命令
      System.out.println("线程" + Thread.currentThread().getName() + "已发送命令,正在等待结果"); 
      cdAnswer.await(); //等待所有运动员,计数器为0 所有运动员到位
      System.out.println("线程" + Thread.currentThread().getName() + "已收到所有响应结果"); 
    } catch (Exception e) {
      e.printStackTrace();
    }       
    service.shutdown();

  }
}

回去结果:

线程pool-1-thread-3正准备接受命令
线程pool-1-thread-1正准备接受命令
线程pool-1-thread-2正准备接受命令
线程main即将发布命令
线程main已发送命令,正在等待结果
线程pool-1-thread-2已接受命令
线程pool-1-thread-1已接受命令
线程pool-1-thread-3已接受命令
线程pool-1-thread-3回应命令处理结果
线程pool-1-thread-2回应命令处理结果
线程pool-1-thread-1回应命令处理结果
线程main已收到所有响应结果

你大概感兴趣的小说:

留下评论

网站地图xml地图