假设我有以下内容:
function requestValue
:我需要多次调用此函数。每次调用它时,它应该计算一些值X
,然后使用计算值作为参数调用另一个函数submitValue(X)
。但是,如果它没有在5秒内完成计算,则应该调用submitValue(-1)
。
请注意,这只是我需要的一个示例,以使问题尽可能简单,函数不计算任何内容(睡眠用于模拟超出时间限制)。
我做的是扩展Thread类,并添加了一个函数来将线程标记为已停止:
class myThread extends Thread{
boolean stop = false;
@Override
public void run(){
Random rand = new Random();
try {
Thread.sleep(200*rand.nextInt(10));
} catch (InterruptedException ex) {
Logger.getLogger(myClass.class.getName()).log(Level.SEVERE, null, ex);
}
if (stop == false)
submitValue(1);
}
void Stop(){
stop = true;
}
}
以下是requestValue
功能:
void requestValue(){
myThread thread = new myThread();
Timer myTimer = new Timer(1000 , new ActionListener(){
@Override
public void actionPerformed(ActionEvent ae) {
thread.Stop();
submitValue(-1);
}
}
);
myTimer.setRepeats(false);
myTimer.start();
thread.start();
}
submitValue
函数当前只打印出参数(1或-1)。
这将阻止在超出时间限制时调用函数submitValue(1)
,但始终会调用submitValue(-1)
。我怎样才能让听众知道submitValue(1)
是否已被呼叫,所以我不再称呼它?还有比我正在使用的方式更好的方法吗?
另一个问题是所有1
都在-1
之前打印出来,为什么会这样?
由于
答案 0 :(得分:2)
有几件事。首先,不要扩展Thread。实现Runnable,如果愿意,可以匿名执行,并将其传递给Thread构造函数。
其次,不要创建第二个Timer线程。这太复杂了,可能是你问题的根源。让主线程阻塞。
使用Thread.join(long millis)执行超时。如果线程仍处于活动状态,请设置"停止"旗。 (注意,它应该是private volatile,有一个方法可以使它成立.explorer关键字将确保工作线程在更改时会看到该值。)然后返回-1。否则,返回计算值。