2013-10-04 33 views
0

我想打電話給我通知我的線程來自另一個班級,但我認爲我會全力以赴。我已經閱讀了許多人嘗試類似的事情的例子,但我似乎無法將其應用於我的代碼。我認爲我的問題是我的同步對象,但我不確定。林新線程,所以不要羞辱我。下面是我的代碼示例:)如何通知另一個班級的線程

public class SendTextOffEdt implements Runnable { 
       private static final long SLEEP_TIME = 3000; 
       public static String TEXT = "Sent off of EDT\n"; 
       private TextBox myTextBox; 

       //public boolean waitBoolean = false; 

       public SendTextOffEdt(TextBox myTextBox) { 
        this.myTextBox = myTextBox; 
       } 
      @Override 
       public void run() { 
        synchronized(this){ 
         //while (true) { 
        try { 
         myTextBox.appendTextOffEdt(TEXT); 
         wait(); 

        } catch (InterruptedException e) { //******** i changed this from another exception!! 
        System.out.println("*----------thread interrupted!"); 
        myTextBox.appendTextOffEdt(TEXT); 
        } 
        } 
       } 
} 

public class Combat extends JPanel { 


private SendTextOffEdt sendTextOffEdt = new SendTextOffEdt(textbox); //just added this  object  

public Combat(){ 
TestNotify(); 
} 

public void TestNotify(){ 
     synchronized(sendTextOffEdt){ //added the sendTextOffEdt object here 

      sendTextOffEdt.notifyAll(); 
      System.out.println("has been notified"); 
     } 
    } 
} 

回答

0

等待(是一樣的this.wait()和notifyAll的()是一樣的this.notifyAll()。所以你可以看到你在完全獨立的對象上調用wait()和notifyAll()。您必須在您調用wait()的同一對象上調用notifyAll()。

Your Combat類需要對您的SendTextOffEdt類的引用。然後Combat類可以調用SendTextOffEdt實例上的notifyAll()來喚醒它。

+0

我編輯了我的代碼來完成你的建議。讓我知道這是否有效。我將sendtextoffedt對象添加到戰鬥類並引用它。如果我告訴你,我可能只是簡單地在線程通知時打印一個字符串。這有幫助嗎? –

+0

@CameronRoberson您的wait()調用後沒有任何代碼。當SendTextOffEdt醒來時,它什麼也不做。 – Jay

+0

我在我的程序中添加了代碼(不是這裏的代碼),它仍然沒有做任何事情。它可能與eventdispatch線程有關。戰鬥類是從一個行動事件中調用的,我相信這意味着它在EDT上是正確的?我需要有一個try catch語句來檢查這個嗎?讓我知道。謝謝傑伊, –

0

爲了實現對線程的最大控制, EDT(用於Swing)與後臺線程(用於耗時的進程),您必須掌握SwingWorker類。根據我的經驗,創建Runnable和使用​​不是典型的應用程序開發。

在此線程中閱讀我的答案以獲取更多信息:Performing two actions in order

您還可以閱讀更多從這裏開始的Oracle文檔:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

向大家介紹一下它說:SwingWorker有兩種方法:doInBackground()總是逃跑的EDT,和done()它總是在EDT運行。

當我代碼:我總是在SwingWorker的構造函數中初始化一個加載對話框,運行我的後臺代碼,然後提示用戶輸入後臺進程的結果(無論這是成功消息,將數據加載到表中等)。

只是一個說明:我不會專注於publish()process()方法,直到你已經掌握了SwingWorker線程。

相關問題