2
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在退出时恢复。

4

2 回答 2

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

于 2013-01-30T07:20:46.697 回答
0

有用性取决于执行主循环中的“做某事”需要多长时间,如果时间很长,您的计时器任务将具有不可预测的间隔,因为它们需要等待当前循环完成。主线程暂停以让定时器任务在循环结束时获得锁,并且在定时器任务完成并释放锁之前不会再次恢复。将“true”传递给构造函数使锁“公平”,以确保 timertask 有机会运行,并且主循环不会无限期地重新获取锁。

另外,请参阅这篇文章,了解为什么计时器任务不能(嗯,不应该,您实际上仍然可以这样做......)命令主线程只是任意停止: 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();
        } 
    }
}
于 2013-01-30T07:30:51.100 回答