【发布时间】:2013-10-11 14:45:47
【问题描述】:
我有一个独立工作的方法 myFuncs.requestData()。它订阅侦听数据并在侦听器接收到所有数据时设置 ReadyTxt="TRUE" - 这会在多个回调中出现。
但是,当我尝试在附加到按钮的 actionPerformed 方法中检查 DataReady 时 - 它未设置,因为似乎 myFuncs.requestData() 仅在我们退出 actionPerformed 之后才被处理/运行。
“独立”是指如果我没有在 ##HERE## 放置任何函数,那么 requestData() 将在 actionPerformed 完成后工作。
如何确保它运行并等待它在 ##HERE## 完成?
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
writePaneln("BUTTON PRESSED "+myFuncs.ReadyTxt);
myFuncs.requestData();
try {
Thread.currentThread().sleep(5000);
} catch (InterruptedException e) {
}
writePaneln("REQUESTED "+myFuncs.ReadyTxt);
##HERE##
}
线程版本:
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
writePaneln("BUTTON PRESSED "+myFuncs.ReadyTxt);
Thread thread = new Thread() {
public void run(){
myFuncs.requestData();
}
};
thread.start();
try {
Thread.currentThread().sleep(5000);
} catch (InterruptedException e) {
}
writePaneln("REQUESTED "+myFuncs.ReadyTxt);
##HERE##
}
简化的 requestData():
public void requestData() {
DataReady="FALSE"
this.dataSubscription.setListener(this);
}
@Override
public void dataUpdated(List<long> updatedData) {
if (updatedData.size() <= 1 ){
this.dataSubscription.destroy();
writePaneln("In dataUpdated DataReady num: "+Dates.size());
DataReady="TRUE";
return;
}
for (long l: updatedData){
writePaneln(l);
Dates.add(l);
}
}
【问题讨论】:
-
我认为需要进一步澄清 - 你是什么意思
myFuncs.requestData()在你退出actionPerformed()完成后运行?你在其他地方打电话给myFuncs.requestData()吗?你有什么例外吗? -
能否提供
requestData内的代码。如果没有更多细节,很难说出为什么它不能工作。在我的脑海中,我猜想一切都在同一个线程上运行。 -
@StormeHawke 我的意思是,无论我“睡”多久 requestData() 直到 actionPerformed 完成后才会运行(我可以说这是因为我的 writePaneln("REQUESTED") 在 requestData 之前写入() 确实)
-
1) 为了尽快获得更好的帮助,请发帖 SSCCE。 2) 不要阻塞 EDT(事件调度线程)——当这种情况发生时,GUI 会“冻结”。而不是调用
Thread.sleep(n)实现一个SwingTimer用于重复任务或SwingWorker用于长时间运行的任务。有关详细信息,请参阅Concurrency in Swing。 -
您的问题确实需要更清楚。提供更多代码(
requesData代码会有很大帮助),您是否在做多线程并且“独立工作”仍然不清楚。我们都可以大胆猜测,但那是在浪费时间。
标签: java awt listener actionlistener