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();
}
}
}
}
|