當前在GUI中生成一個關鍵事件,然後通過幾個類傳遞給一個在單獨線程中運行的類。線程正在等待關鍵事件,並且在接收到一個關鍵事件時,更改類鏈中的變量將被更改(請參見圖表)。但是在調試過程中變量不會改變。來自線程的另一個類的訪問變量
線程正在訪問的類當然是在它自己的線程中,因爲它是從GUI調用的,這導致我認爲這是一個併發問題。
有沒有辦法解決這個可能使用原子整數或鎖?我已經看到了一些使用同步函數的例子,但是我不能讓它們工作,因爲它們沒有解釋類的需求。 (我的意思是他們給你的代碼做同步,但他們沒有解釋如何使一個類「同步」)。
下面是在E類線程的代碼,可以將線程的對象引用從上方從類接收上述等一類的基準的類設置
private Processor processor;
public void run() {
while (true) {
if (keyevent != null) {
keyevent = null;
processor.I = 4;
}
}
}
public void SetProcessor(Processor processor) {
this.processor = processor;
}
調試註釋的擴展。在調試過程中,如果我只調試E類中的線程並逐步完成,代碼將正常運行並處理器。我收到四個值。但是,當我不調試那個線程時,處理器中沒有任何事情發生,這就是爲什麼我認爲這可能是一個併發問題。
使我在Class B和Atomic Integer中訪問的變量,也使一些使用的功能同步。調試環境:(之外仍然dosent功能
代碼在B級從E類稱爲
public void SetI(int value){//also tried using synchronized as well
I.set(value);
}
該KeyEvent在GUI類通過的KeyListener產生(whenver一個鍵被按下時觸發),該KeyEvent對象然後通過幾個「滴入」函數傳遞給E類,這些函數只傳遞給下一個類,因此GUI調用processor.setKeyevent(e),處理器然後調用bus.setKeyevent(e)等等直到KeyEvent屬性設置在E類中。
系統初始化後,E類中的線程啓動,is不斷檢查Keyevent屬性的值,一旦KeyEvent不爲null,即它已從GUI(通過其他所有內容)傳遞過來,E類然後在類B中設置整數屬性的值。
發生了什麼當鍵被按下時什麼也沒有發生,應該發生的事情是該整數是類B應該改變,因爲類E,但它不是。由於net beans不允許我一次調試兩個線程,所以它讓我有點尷尬,當我在E類中的線程之外的代碼中放置斷點時,它不起作用,就好像線程沒有運行或者作爲如果它沒有收到keyevent,如果我在線程中放置斷點而不在外面工作,那麼B類中I的值會改變。如果它在調試之外運行,它將無法工作:/
顯示源。 E類的實例如何獲得對B類的引用? – digitaljoel 2013-05-08 20:49:28
你說過「在調試過程中變量沒有改變」。你可以發佈打印調試的代碼和修改變量的代碼(在其他類中)嗎? – KyleM 2013-05-08 20:50:07
發送'ClassB'的對象作爲參數,直到達到'ClassE',也許? – Goodwine 2013-05-08 20:55:02