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

为了实现对线程的最大控制;EDT(对于Swing)与后台线程(对于耗时的进程),您必须掌握SwingWorker该类。根据我的经验,创建Runnable和使用synchronized并不适用于典型的应用程序开发。

阅读我在此线程中的答案以获取更多信息:按顺序执行两个操作

您还可以在此处从 Oracle 文档中阅读更多信息:http: //docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

简要介绍一下它所说的内容:SwingWorker有两种方法:doInBackground()始终在 EDT 之外运行,以及done()始终在 EDT 上运行。

当我编码时:我总是在 的构造函数中初始化一个加载对话框SwingWorker,运行我的后台代码,并提示用户后台进程的结果(无论是成功消息,将数据加载到表中等)。

请注意:在您掌握线程之前,我不会专注于publish()and方法。process()SwingWorker

于 2013-10-04T03:21:08.040 回答
0

wait() 与 this.wait() 相同,notifyAll() 与 this.notifyAll() 相同。因此,您可以看到您正在对完全独立的对象调用 wait() 和 notifyAll()。您必须在调用 wait() 的同一对象上调用 notifyAll()。

您的 Combat 类需要引用您的 SendTextOffEdt 类。然后 Combat 类可以调用 SendTextOffEdt 实例上的 notifyAll() 来唤醒它。

于 2013-10-04T03:17:30.810 回答