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);
}
}
如何在输入main
时暂停TimerTask
主题,并在退出时重新开始。
答案 0 :(得分:1)
创建一个锁并等待,直到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
答案 1 :(得分:0)
有用性取决于主循环中“执行某些操作”执行的时间长短,如果很长一段时间您的计时器任务将具有不可预测的时间间隔,因为它们需要等待循环的当前传递去完成。主线程暂停以使计时器任务在循环结束时具有锁定,并且在计时器任务完成之前不会再次恢复并释放锁定。将'true'传递给构造函数会使锁'公平',以确保timertask有机会运行,而主循环不会无限期地重新锁定。
另外,请参阅这篇文章,了解为什么计时器任务不能(好吧,不应该,你仍然可以实际执行...)命令主线程ti只是随意停止: http://docs.oracle.com/javase/6/docs/technotes/guides/concurrency/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();
}
}
}