Java 在多執行緒當中順序執行程式

2021-08-16 21:12:59 字數 1341 閱讀 4674

有三個執行緒,每個執行緒,列印a、b、c 的操作,現要求同時執行三個執行緒,要求列印的順序為a、b、c 不亂序,重複10次。

在這裡實際上是要進行執行緒的順序操作。一般來說,執行緒的操作是無序的,隨機發生的,若只是單純的讓這些執行緒發生的話,那麼abc的列印順序自然就是無序的。那麼,現在的問題就在於要約束執行緒的執行。

在我的想法當中,約束執行緒的執行,那麼只需要將不需要執行的執行緒暫時掛起,讓需要執行的執行緒繼續執行就可以達到這種效果了。

那麼,在這裡,我就將引入乙個訊號量(semaphore),利用訊號量去控制線程的進行。

或許有的朋友會問訊號量是什麼,訊號量其實就相當於乙個大門(臨界區)的門鎖,訊號量則是限制了進入門(臨界區)的人數(執行緒數)。舉個例子,當你的訊號量為10的時候,若有11個執行緒申請進入,那麼當進入了10個執行緒之後,臨界區的入口則會被掛起,那麼,最後的那個執行緒只能等待,直到已經進入了門(臨界區)內的**執行完畢,釋放了訊號量才可以進入。

那麼,控制線程的順序執行的原理也是這樣的。

當你要列印字母a的時候,那麼列印字母bc的執行緒自然需要掛起,當字母a列印完畢之後,再釋放了字母b的訊號量,自然就可以列印字母b了,同樣,字母c也可以用同樣的方法去列印。以此類推,字母abc就可以按順序全部列印出來了。

之後則是這個思路的實現方式。

首先,要有三個訊號量分別去約束abc的列印的執行緒    

//訊號量只有1則代表只有1個執行緒可以訪問臨界區

semaphore semaphorea = new semaphore(1);

semaphore semaphoreb = new semaphore(1);

semaphore semaphorec = new semaphore(1);

semaphoreb.acquire();

semaphorec.acquire();

當然,因為必須要列印字母a為先,所以,一開始就要掛起字母bc的執行緒

然後則是執行緒的編寫

public class printthread extends thread  

@override

public void run()

} catch (interruptedexception e) }}

當要列印當前字母的時候,首先先將這段**進入了臨界區,這意味著這次列印之後這段**將會被掛起,直到訊號量被釋放為止(因為訊號量的數量設定為1),然後,在列印之後,釋放下乙個將要執行的**的訊號量,這意味著列印下乙個字母的**將會被執行,以此類推,就可以一直按順序執行**了。

public class main 

}

java多執行緒執行順序

我們建立兩個執行緒,讓奇數執行緒輸出奇數,偶數執行緒執行輸出偶數。先來看看 實現 package test import org.ietf.jgss.oid public class threadnum extends thread public void run system.out.printl...

linux shell 多執行緒執行程式

shell中並沒有真正意義的多執行緒,要實現多執行緒可以啟動多個後端程序,最大程度利用cpu效能。直接看 示例吧。1 順序執行的 1 bin bash 2date 3for i in seq15 4do5 9done 10date 輸出 sat nov 19 09 21 51 cst 2016 sl...

多執行緒按照順序執行

自己瀏覽了多個的文章,自己的理解加上的思路,彙總成了這篇文章 1.如何讓多執行緒按照既定順序執行 2.原理 1.直接上 final long start system.currenttimemillis thread t1 new thread catch interruptedexception ...