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");
        }
    }
}
4

2 に答える 2

0

wait() は this.wait() と同じで、notifyAll() は this.notifyAll() と同じです。したがって、まったく別のオブジェクトで wait() と notifyAll() を呼び出していることがわかります。wait() を呼び出したのと同じオブジェクトで notifyAll() を呼び出す必要があります。

Combat クラスには、SendTextOffEdt クラスへの参照が必要です。次に、Combat クラスは SendTextOffEdt インスタンスで notifyAll() を呼び出してウェイクアップできます。

于 2013-10-04T03:17:30.810 に答える
0

スレッド化を最大限に制御するには、次のようにします。EDT (の場合Swing) とバックグラウンド スレッド (時間のかかるプロセスの場合) を比較するには、SwingWorkerクラスをマスターする必要があります。私の経験では、 を作成Runnableして使用することsynchronizedは、典型的なアプリケーション開発には向いていません。

詳細については、このスレッドで私の回答をお読みください: Performing two actions in order .

ここの Oracle ドキュメントから詳細を読むこともできます: http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

簡単に言うと、 にSwingWorkerは 2 つの方法があります。常にdoInBackground()EDT をオフにして実行する方法と、done()常に EDT で実行する方法です。

コードを作成するとき: 私は常に のコンストラクターで読み込みダイアログを初期化しSwingWorker、バックグラウンド コードを実行し、バックグラウンド プロセスの結果 (成功メッセージかどうか、データをテーブルに読み込むかどうかなど) をユーザーに通知します。

注意:スレッド化をマスターするまでは、 publish()andprocess()メソッドについてはまだ説明しません。SwingWorker

于 2013-10-04T03:21:08.040 に答える