我無法獲得我想要的輸出。因此,這些是在關鍵部分運行的兩個線程。一個線程打印「a」,另一個打印「b」。線程必須打印至30個字符。之後,線程打印接下來應該打印一個新行並將字符計數器重置爲1.我可以讓他們打印,但我找不到打印最後一個字符(31)並將計數器重置爲1的方法並打破循環並退出。如果在2線程內循環
我的程序正在運行,直到您強制停止,因爲我將循環設置爲起點。 我知道我可以通過設置do-while(計數器< = 30)來獲得它,但我希望它是第一次設置爲while(true) 感謝您的幫助。
我無法獲得我想要的輸出。因此,這些是在關鍵部分運行的兩個線程。一個線程打印「a」,另一個打印「b」。線程必須打印至30個字符。之後,線程打印接下來應該打印一個新行並將字符計數器重置爲1.我可以讓他們打印,但我找不到打印最後一個字符(31)並將計數器重置爲1的方法並打破循環並退出。如果在2線程內循環
我的程序正在運行,直到您強制停止,因爲我將循環設置爲起點。 我知道我可以通過設置do-while(計數器< = 30)來獲得它,但我希望它是第一次設置爲while(true) 感謝您的幫助。
首先,你不需要兩個獨立的類(擴展Thread)做同樣的事情(我現在知道有一點點區別,但沒有必要)。你可以簡單地做
Thread a = new MyThread().start();
Thread b = new MyThread().start();
其次你要的是你的兩個線程上的字符數同步。你目前所擁有的是一種經典的競爭條件,你需要保護關鍵部分的代碼。要做到這一點,你需要一個同步對象。比方說,你要做的就是創建一個對象O並將它傳遞給每個線程
Object lock = new Object();
Thread a = new MyThread(lock).start();
Thread b = new MyThread(lock).start();
和保存,作爲一個成員變量
public MyThread(Object lock) {
this.lock = lock;
}
現在你用這個鎖時同步訪問共享資源計數器。兩個線程都具有相同的鎖定非常重要。
int myCounter;
sychronized (lock) {
if (counter == 30) counter = 0;
else { counter++ }
myCounter = counter; // Make a copy of the shared counter and release the lock
}
// Code to print 'A'+myCounter, or whatrever you want with myCounter. This is your local copy and should be used here
您需要共享變量爲volatile
,以便它們不會被每個線程緩存。
而且,因爲你不能使揮發性值的數組,使用兩個布爾:
volatile int turn;
volatile boolean flag1 = false;
volatile boolean flag2 = false;
volatile int counter = 0;
volatile String cscVar = "a";
volatile String cscVar2 = "b";
要了解更多關於volatile
和原子訪問:The Java™ Tutorials