有没有办法像线程那样做一些事情,在每个x数量的ms上做一些事情,我可以在需要时启动,停止和恢复?我知道一个线程可以启动,但没有真正安全的方法来停止和恢复线程。java - 你如何制作可以启动和停止的线程?
回答
您可以使用java.util.Timer类来安排后台工作线程上的任务。
ScheduledExecutorService的是一个更好的选择。 – Scorpion 2012-01-16 18:03:05
@Scorpion:如果任务很简单,则不需要使用更复杂的构造。 – Tudor 2012-01-16 18:04:19
Tudor:使用ScheduledExecutorService并不复杂(至少不比使用计时器更复杂),如@ Lirik的答案所示。此外,这个(http://stackoverflow.com/questions/409932/java-timer-vs-executorservice)讨论应该让你一些洞察为什么应该避免计时器。 – Scorpion 2012-01-17 07:46:59
确实有安全的方法来停止线程。阅读http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html。暂停线程并恢复它只是设置一个标志并适当使用wait
和notifyAll
的问题。
不过,您可能正在寻找更高级别的抽象。看看ScheduledExecutorService
。
这里有一堆关于如何启动实例/停止周期任务在Java中:
- How to schedule a periodic task in Java?(基本上执行服务)
- Schedule periodic tasks(更详细的探索各种方式来安排定期任务)
来自第一链路的例子:
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(yourRunnable, 8, 8, HOURS);
线程pol执行程序的javadoc具有创建可以暂停/恢复的线程池的示例。这里是链接http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html
它不是工业实力,但应该足以给你的想法。
我相信你要找的是什么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();
}
}
}
}
- 1. Java多线程。如何停止线程并释放启动器?
- 2. 如何启动/停止和监视Java线程?
- 3. 启动停止的线程?
- 4. 启动和停止(强制)线程作业
- 5. C#线程 - 如何启动和停止线程
- 6. 如何停止/启动线程?
- 7. 如何启动停止线程
- 8. 从WebApp启动和停止线程
- 9. 如何使用相同的shortKey启动和停止线程?
- 10. 启动和停止线程JButton对齐
- 11. 从ASP.NET启动和停止线程
- 12. 如何停止Java线程?
- 13. 如何停止Java线程?
- 14. 是否可以启动(并停止)DLL中的线程?
- 15. 你可以停止滚动的HTML5视频暂停/停止吗?
- 16. 如何停止/启动或重新启动计时器线程
- 17. 如何一次又一次启动和停止后台线程?
- 18. 如何启动和停止后台线程iOS
- 19. 如何以编程方式控制硒的启动和停止RC
- 20. 如何停止Java中的线程?
- 21. 如何停止线程当Tomcat停止
- 22. 如何启动和管理Java线程?
- 23. 如何以编程方式启动和停止歌曲?
- 24. SurfaceView线程 - 启动/停止onDraw调用?
- 25. 停止并重新启动线程
- 26. 停止并启动线程Android
- 27. 如何管理ruby工作进程的启动,停止和重新启动?
- 28. 如何停止控制台暂停我的线程和任务?
- 29. 如何在java中以编程方式启动和停止Amazon EC2实例
- 30. 暂停的线程可以中止吗?
看一看http://www.quartz-scheduler.org/ – 2012-01-16 18:01:28