[英]How can I pause the main thread while TimerTask is executing?
package demo;
import java.util.Timer;
import java.util.TimerTask;
public class Demo {
public static Timer timer = new Timer();
static {
MyTask task = new MyTask();
timer.schedule(task, 1000);
}
public static void main(String[] args) {
System.out.println("Begin...");
while (true) {
// do something
}
}
}
class MyTask extends TimerTask {
public void run() {
// do something
MyTask task = new MyTask();
Demo.timer.schedule(task, 1000);
}
}
如何在进入TimerTask
使main
线程暂停,并在退出时恢复main
线程。
创建一个锁,直到MyTask设置isFinished标志并调用lock.notify()
static Object lock = new Object();
static boolean isFinished;
public static void main(String[] args) throws Exception {
System.out.println("Begin...");
synchronized (lock) {
while (!isFinished) {
lock.wait();
}
}
}
请注意,lock.wait()需要处于while循环中,Java不保证仅通过通知即可唤醒您的线程,请参见Object.wait API
有用程度取决于您在主循环中执行“做某事”需要花费多长时间,如果时间较长,您的计时器任务将具有不可预测的间隔,因为它们需要等待当前循环完成。 主线程暂停以使计时器任务在循环结束时具有锁定,并且直到计时器任务完成并释放该锁定后才会再次恢复。 将“ true”传递给构造函数将使锁“公平”,从而确保timertask有机会运行,并且主循环不会保持无限期地重新获取该锁。
另外,请参阅这篇文章,了解为什么计时器任务无法执行(嗯,应该不执行,您仍然可以实际执行...)命令主线程ti任意停止: http : //docs.oracle.com/javase/6/文档/技术说明/引导/并发/ threadPrimitiveDeprecation.html
package demo;
import java.util.Timer;
import java.util.TimerTask;
public class Demo {
public static Timer timer = new Timer();
public static Lock lock = new ReentrantLock(true);
static {
MyTask task = new MyTask();
timer.schedule(task, 1000);
}
public static void main(String[] args) {
System.out.println("Begin...");
while (true) {
lock.lock();
try {
// do something
finally {
lock.unlock();
}
}
}
}
class MyTask extends TimerTask {
public void run() {
Demo.lock.lock();
try {
// do something
MyTask task = new MyTask();
Demo.timer.schedule(task, 1000);
finally {
Demo.lock.unlock();
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.