java - 你如何创建一个可以启动和停止的线程?

时间:2012-01-16 17:55:10

标签: java multithreading timer

有没有办法制作类似线程的东西,每隔x个ms就可以执行某些操作,我可以在需要时启动,停止和恢复?我知道可以启动一个线程但是没有真正安全的方法来停止和恢复一个线程。

5 个答案:

答案 0 :(得分:4)

以下是一些关于如何在Java中启动/停止定期任务的示例:

第一个链接中的示例:

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(yourRunnable, 8, 8, HOURS);

答案 1 :(得分:2)

您可以使用java.util.Timer类在后台工作线程上安排任务。

答案 2 :(得分:2)

线程pol执行器的javadocs有一个创建一个可以暂停/恢复的线程池的例子。这是链接http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html

它不具备工业实力,但应足以为您提供创意。

答案 3 :(得分:1)

我相信你正在寻找的是Timer类,它允许你定期执行TimerTask子类的run方法。

对于重复发生的事件,http://enos.itcollege.ee/~jpoial/docs/tutorial/essential/threads/timer.html给出的示例(为方便起见,稍作修改并复制):

 public class AnnoyingMessage {
    Timer timer;

    public AnnoyingBeep() {
        timer = new Timer();
        timer.schedule(new RemindTask(),
                       0,        //initial delay
                       1*1000);  //subsequent rate = once a second. 
    }

    class RemindTask extends TimerTask {
        int numWarningBeeps = 3;
        public void run() {
            if (numWarningBeeps > 0) {
                System.out.println(" MESSAGE!");
                numWarningBeeps--;
            } else {
                System.out.println("Done");
                timer.cancel(); 
            }
        }
    }
}

答案 4 :(得分:0)

有绝对安全的方法来阻止线程。阅读http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html。暂停线程并恢复它只需设置一个标志并适当地使用waitnotifyAll

但是,您可能正在寻找更高级别的抽象。看看ScheduledExecutorService