试图构造一个Runnable,必须在给定的时间内结束。
目前,我正在使用java.util.Timer中断Runnable线程。
Timer在Runnable启动之后就开始了。
import java.util.Timer;
import java.util.TimerTask;
public class test {
Thread task;
Timer timer;
public void start(){
task = new Thread(new worker());
timer = new Timer("timer",true);
task.start();
timer.schedule(new Terminator(),1000*2);
}
class worker implements Runnable{
@Override
public void run() {
for (int i = 0 ; i < 2; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Test Interrupted !!");
return;
}
}
System.out.println("Test Finished !!");
timer.cancel();
}
}
class Terminator extends TimerTask{
@Override
public void run() {
task.interrupt();
System.out.println("Test Terminated !!");
}
}
}但我怀疑这会导致Timer和Runnable线程之间的争用状态:Runnable即将完成,Timer也在触发。
这会导致这两个都完成!然后终止了!!被打印出来?如果是的话,如何避免呢?
更新:
这种情况发生在:
11-09 21:14:40.741: INFO/System.out(31442): Test Finished !! 18
11-09 21:14:40.751: INFO/System.out(31442): Test Terminated !! 18
11-09 21:14:40.751: INFO/System.out(31442): Test Finished !! 19
11-09 21:14:40.751: INFO/System.out(31442): Test Terminated !! 19发布于 2012-11-09 14:30:17
这会导致这两个都完成!然后终止了!!被打印出来?
是。当消息“完成”被打印时,计时器可能会在被取消之前触发。
System.out.println("Finished !!");
// The timer can fire here.
timer.cancel(); 如果发生这种情况,两条消息都将被打印出来。
为了避免这个问题,您可以使用同步。
synchronized (someObject) {
if (!finished) {
finished = true;
System.out.println("Finished !!");
timer.cancel();
}
}在终结者里:
synchronized (someObject) {
if (!finished) {
finished = true;
task.interrupt();
System.out.println("Test Terminated !!");
}
}这将防止打印这两种邮件。
https://stackoverflow.com/questions/13309870
复制相似问题