多執行緒 如何實現多個執行緒按序列印

2021-10-05 18:45:41 字數 1934 閱讀 7775

提供乙個類

public class foo 

private static void printb()

private static void printc()

會有3個執行緒分別呼叫printa(),printb(),printc()方法;

程式設計實現輸出結果是abc.

透過問題看本質:

要實現按序列印,也就是printb要在printa執行之後執行, printc要在printb執行之後執行;

private static final object obj = new object();

private static int type = 1;

private static void printa() }}

private static void printb() throws interruptedexception

if (type == 2) }}

private static void printc() throws interruptedexception

if (type == 3) }}

@test

public void test1() throws interruptedexception

}).start();

new thread(new runnable()

}).start();

new thread(new runnable()

}).start();

thread.sleep(3000);

}

思路:

當執行緒a沒執行之前,利用wait()方法阻塞b, c執行緒; 執行緒a執行完成之後,更新type值並利用notifyall()喚醒b,c執行緒, 使得b執行緒得以往下執行(此時c執行緒被喚醒後因為type !=3,因此會被wait()方法再次阻塞);b執行緒執行完成後更新type值並喚醒執行緒c,使得執行緒c得以往下執行;

//初始化兩個值為1的計數器

private static countdownlatch countdownlatchb = new countdownlatch(1);

private static countdownlatch countdownlatchc = new countdownlatch(1);

private static void printa2()

private static void printb2() throws interruptedexception

private static void printc2() throws interruptedexception

@test

public void test2() throws interruptedexception

}).start();

new thread(new runnable()

}).start();

new thread(new runnable()

}).start();

thread.sleep(3000);

}

countdownlatch是乙個計數器, 它在初始化時要輸入乙個數值型的引數作為計數器的值; 其有兩個主要的方法,await()和countdown(); countdown()方法會將計數器的值減1;await()方法是:當計數器值不為0時,阻塞當前執行緒;計數器值為0時,喚醒當前執行緒; 該篇文章有對countdownlatch的詳細解析:如何實現某個執行緒在其他執行緒執行完畢之後再執行

利用countdownlatch,建立兩個值為1的計數器;分別用來阻塞b,c執行緒;當執行緒a執行完成之後,將b執行緒的計數器減1,使其計數器值為0,從而b執行緒得以喚醒;同理,b執行緒執行完成之後會喚醒c執行緒;從而達到按序執行的效果

多執行緒 LeetCode 按序列印

我們提供了乙個類 public class foo public void two public void three 三個不同的執行緒將會共用乙個 foo 例項。執行緒 a 將會呼叫 one 方法 執行緒 b 將會呼叫 two 方法 執行緒 c 將會呼叫 three 方法請設計修改程式,以確保 t...

多執行緒按順序列印

於leetcode1114 我們提供了乙個類 public class foo public void second public void third 三個不同的執行緒將會共用乙個 foo 例項。請設計修改程式,以確保 second 方法在 first 方法之後被執行,third 方法在 seco...

1114 按序列印 多執行緒

難度簡單237 我們提供了乙個類 public class foo public void second public void third 三個不同的執行緒 a b c 將會共用乙個foo例項。請設計修改程式,以確保second 方法在first 方法之後被執行,third 方法在second 方...