是否有一个相当于阻塞java.util.Timer
班级?我正在寻找将阻止创建计时器的线程的解决方案。
以下代码是非阻塞的"After timer"
输出立即打印。
new Timer().schedule(new TimerTask() {
@Override
public void run() {
System.out.println("Hello");
}
}, 1000, 1000);
System.out.println("After timer");
我想要实现的是"After timer"
仅当计时器被取消时(以及之后被取消)才打印消息。
撇开这听起来像是一件奇怪的事情......而且阻塞线程是浪费......
我不知道有哪个标准 Java API 可以做到这一点。
Since Timer
不是一个final
类,您可以通过覆盖 Schedule 方法来扩展该类以实现阻塞行为,并使用能够(也)解除阻塞任何线程的方法覆盖 cancel 方法。像这样的东西:
public class MyTimer extends Timer {
private final Object lock = new Object();
private boolean canceled = false;
@Override
public void schedule(TimerTask task, long delay) {
synchronize (lock) {
super.schedule(task, delay);
while (!cancelled) {
lock.wait();
}
}
}
// and more schedule overrides ...
@Override
public void cancel() {
synchronize (lock) {
super.cancel();
canceled = true;
lock.notifyAll();
}
}
}
请注意,cancel()
类似于标准Timer::cancel
方法。
- 计划任务被取消。
- 如果任务正在执行,则允许其完成。
- 取消调用不等待任务完成
- 之后
Timer
已取消,不再接受任何任务。
最后,请注意
new MyTimer().schedule(new TimerTask() {
@Override
public void run() {
System.out.println("Hello");
}
}, 1000, 1000);
(使用阻塞调度方法)不可能解除阻塞。这MyTimer
实例必须发布到不同的线程,以便该线程可以调用cancel()
on it.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)