试图构建一个Runnable
that must在给定的期限内结束。
目前我正在使用java.util.Timer
打断Runnable
thread.
Timer
之后开始Runnable
starts.
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
and Runnable
线程:Runnable
即将完成,并且Timer
也在射击。
这是否会导致两者完成的 !! and 终止!正在打印?如果是这样,如何避免呢?
Update:
它发生:
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
这是否会导致两者都完成!并终止!正在打印?
是的。当打印消息“完成”时,计时器可能会在取消之前触发。
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 !!");
}
}
这会阻止打印两条消息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)