java 线程同时启动_java多个线程同时启动的两种方式
【背景】今天遇到一個并發問題,為了在開發環境復現這個bug,需要讓多個線程同時執行到某條語句。
【解決方案】
java1.5的concurrent包下的CyclicBarrier 和 CountDownLatch都能解決這個問題。不得不佩服Doug Lea!
【方法1】使用CyclicBarrier
public class TestCyclicBarrier {
class Worker implements Runnable{
CyclicBarrier cyclicBarrier;
public Worker(CyclicBarrier cyclicBarrier){
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
try {
cyclicBarrier.await(); // 等待其它線程
System.out.println(Thread.currentThread().getName() + "啟動@" + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
public void doTest() throws InterruptedException {
final int N = 5; // 線程數
CyclicBarrier cyclicBarrier = new CyclicBarrier(N);
for(int i=0;i
new Thread(new Worker(cyclicBarrier)).start();
}
}
public static void main(String[] args) throws InterruptedException {
TestCyclicBarrier testCyclicBarrier = new TestCyclicBarrier();
testCyclicBarrier.doTest();
}
}
【方法1結果】
【方法2】使用CountDownLatch
package thread;
import java.util.concurrent.CountDownLatch;
public class TestCountDownLatch {
class Worker implements Runnable{
CountDownLatch countDownLatch;
Worker(CountDownLatch countDownLatch){
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
try {
countDownLatch.await(); // 等待其它線程
System.out.println(Thread.currentThread().getName() + "啟動@" + System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void doTest() throws InterruptedException {
final int N = 5; // 線程數
CountDownLatch countDownLatch = new CountDownLatch(N);
for(int i=0;i
new Thread(new Worker(countDownLatch)).start();
countDownLatch.countDown();
}
}
public static void main(String[] args) throws InterruptedException {
TestCountDownLatch testCountDownLatch = new TestCountDownLatch();
testCountDownLatch.doTest();
}
}
【方法2結果】
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的java 线程同时启动_java多个线程同时启动的两种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 创建临时表 时间类型_MyS
- 下一篇: java try 返回值_JAVA的tr