1.声明计数器线程个数:
CountDownLatch latch= new CountDownLatch(2);
2.线程启动带参数latch:
Worker
worker1= new Worker("zhang
san" , 5000,
latch);
3.线程启动,主线程阻塞:
worker1.start();
latch.await();
4.线程run()方法中计数器技术开始:
public void run(){
System. out.println("Worker
" +workerName +"
do work begin at "+sdf.format( new Date()));
doWork(); //工作了
latch.countDown();//工人完成工作,计数器减一
}
5.整体代码Test:
package tets;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
public class CountDownLatchTest {
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())+"
"+Thread.currentThread().getName());
}
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();
}
}
}
}
|
相关文章
- 07-13懒汉式单例模式的线程安全实现(最新)
- 07-13多线程003--volatile的可见性和禁止指令重排序怎么实现的
- 07-13线程数量问题以及线程实现的第二种方式/day18
- 07-13Windows利用互斥对象实现线程同步---买火车票的案例
- 07-13网编(18):多线程服务器端的实现
- 07-13初夏小谈:基于TCP协议的网络通信(线程池实现)
- 07-13实现TOLock过程中的一处多线程bug
- 07-13(二十六)Spring Boot使用@Async实现异步调用:ThreadPoolTaskScheduler线程池的优雅关闭
- 07-13创建多线程的方式:继承Thread类和实现Runnable接口
- 07-13多线程系列3_生产者消费者模式的两种实现方法