前言
在Java中, 如何启动多个线程. 随后使某项任务分步执行.
使用Join方法
使用CountDownLatch
CountDownLatch 内核心方法:
- await(): 等待. 当count值为0时, 才能继续执行.
- countDown(): 和方法名一样. 具体作用时将方法名称-1.
- getCount(): 获取当前count值.
简单都小测试
import java.util.concurrent.CountDownLatch;
public class TestJava {
public static final CountDownLatch countDownLatch = new CountDownLatch(3);
public static void main(String[] args) throws InterruptedException {
Thread threadA1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("AThreadName: "+Thread.currentThread().getName()+" - "+ "count:"+ countDownLatch.getCount());
countDownLatch.countDown();
}
});
Thread threadA2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("AThreadName: "+Thread.currentThread().getName()+" - "+ "count:"+ countDownLatch.getCount());
countDownLatch.countDown();
}
});
Thread threadA3 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("AThreadName: "+Thread.currentThread().getName()+" - "+ "count:"+ countDownLatch.getCount());
countDownLatch.countDown();
}
});
threadA1.start();
threadA2.start();
threadA3.start();
// 等待3个线程都执行完成
countDownLatch.await();
Thread threadB1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("BThreadName: "+Thread.currentThread().getName()+" - "+ "count:"+ countDownLatch.getCount());
}
});
Thread threadB2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("BThreadName: "+Thread.currentThread().getName()+" - "+ "count:"+ countDownLatch.getCount());
}
});
threadB1.start();
threadB2.start();
}
}
实现细节
CountDownLatch其实也是使用AQS对Java中锁的一种实现方式. 有空的话可以详细解读下具体实现.