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