2014-11-16 53 views
0

我無法獲得我想要的輸出。因此,這些是在關鍵部分運行的兩個線程。一個線程打印「a」,另一個打印「b」。線程必須打印至30個字符。之後,線程打印接下來應該打印一個新行並將字符計數器重置爲1.我可以讓他們打印,但我找不到打印最後一個字符(31)並將計數器重置爲1的方法並打破循環並退出。如果在2線程內循環

我的程序正在運行,直到您強制停止,因爲我將循環設置爲起點。 我知道我可以通過設置do-while(計數器< = 30)來獲得它,但我希望它是第一次設置爲while(true) 感謝您的幫助。

回答

0

首先,你不需要兩個獨立的類(擴展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 
0

您需要共享變量爲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