【Java知識】java線程控制,控制線程的執行順序,有多個方法,計數器信號量你用過嗎?
保證線程的順序
第一種:使用join
for (int i = 0; i < 10; i++){
Thread t1 = new Thread(new Runnable() {
public void run() {
System.out.println("我是t1線程");
}
});
?
Thread t2 = new Thread(new Runnable() {
public void run() {
System.out.println("我是t2線程\n");
}
});
t1.start();
t1.join();
t2.start();
Thread.sleep(500);
}
第二種:使用單線程池
ExecutorService executor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++){
Thread t1 = new Thread(new Runnable() {
public void run() {
System.out.println("我是t1線程");
}
});
?
Thread t2 = new Thread(new Runnable() {
public void run() {
System.out.println("我是t2線程\n");
}
});
executor.submit(t1);
executor.submit(t2);
Thread.sleep(500);
}
executor.shutdown();
第三種:使用CountDownLatch計數器
for (int i = 0; i < 10; i++){
final CountDownLatch count = new CountDownLatch(1);
Thread t1 = new Thread(new Runnable() {
public void run() {
System.out.println("我是t1線程");
count.countDown();
}
});
?
Thread t2 = new Thread(new Runnable() {
public void run() {
try {
count.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我是t2線程\n");
}
});
?
t2.start();
t1.start();
?
Thread.sleep(500);
}
第四種:使用wait和notify控制
第五種:使用CyclicBarrier循環屏障
第六種:使用Semaphore信號量
第七種:使用消息隊列等中間件,如zookeeper、kafka等
你問我為什么后面幾種高大上的為什么沒有例子,因為它們例子寫起來代碼有點多,如果沒有使用過的同學一定要百度了解下,特別是CyclicBarrier和Semaphore,這兩個是java后面新增的并發包中的類,好用不貴。不然都不好意思說自己精通java
總結
以上多種控制線程順序的方法,可以根據不同的場景使用不同的方法。每種方法都有他們的使用場景,在不同的場景選擇最合適的方法才能事半功倍。

浙公網安備 33010602011771號