如何从另一个类通知一个线程

时间:2013-10-04 02:12:53

标签: java multithreading swing concurrency

我试图通过另一个班级来调用我的通知,但我认为我的错误。我已经阅读了很多人尝试类似事情的例子,但我似乎无法将其应用到我的代码中。我认为我的问题是我的同步对象,但我不确定。我是新手,所以不要羞辱我。以下是我的代码示例:

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

请阅读此主题中的答案以获取更多信息: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方法。