2012-01-16 171 views
5

有没有办法像线程那样做一些事情,在每个x数量的ms上做一些事情,我可以在需要时启动,停止和恢复?我知道一个线程可以启动,但没有真正安全的方法来停止和恢复线程。java - 你如何制作可以启动和停止的线程?

+0

看一看http://www.quartz-scheduler.org/ – 2012-01-16 18:01:28

回答

2

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

+0

ScheduledExecutorService的是一个更好的选择。 – Scorpion 2012-01-16 18:03:05

+1

@Scorpion:如果任务很简单,则不需要使用更复杂的构造。 – Tudor 2012-01-16 18:04:19

+0

Tudor:使用ScheduledExecutorService并不复杂(至少不比使用计时器更复杂),如@ Lirik的答案所示。此外,这个(http://stackoverflow.com/questions/409932/java-timer-vs-executorservice)讨论应该让你一些洞察为什么应该避免计时器。 – Scorpion 2012-01-17 07:46:59

4

这里有一堆关于如何启动实例/停止周期任务在Java中:

来自第一链路的例子:

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
scheduler.scheduleAtFixedRate(yourRunnable, 8, 8, HOURS); 
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(); 
      } 
     } 
    } 
}