如何设置无限循环并打破它。 (Java线程)
我已经设置了一个线程,我想使用循环运行它。 所以这个线程应该在循环中运行并在一定时间内中断并再次运行循环。
请不要知道如何做到这一点。 有人可以指导我
假设您运行的是JDK 1.5或更高版本(内存模型已得到澄清和改进),您可以使用
public class MyRunnable extends Runnable { private volatile boolean cancelled; public void run() { while (!cancelled) { doStuff(); } } public void cancel() { cancelled = true; } public boolean isCancelled() { return cancelled; } }j
或者,使用java.util.concurrent.Future和FutureTask,它支持开箱即用的取消。
Java有一个内置的机制,让线程做一些事情,然后等待一段时间再做一次,称为Timer
。 您可以将循环内部的内容放入TimerTask
的Run()
方法中,然后告诉计时器您希望它完成的频率。
TimerTask task = new TimerTask() { @Override public void run() { //do some processing } }; Timer timer = new Timer(); timer.schedule(task, 0l, 1000l); //call the run() method at 1 second intervals
在程序完成时关闭它当然是你的工作。
我觉得我们错过了执行官!
您可以使用ScheduledExecutorService来运行任务,然后在一段固定的时间后再次运行。 它类似于TimerTask,但更易于管理和更好地维护。
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleAtFixedRate(new Runnable() { public void run() { //do work here } }, 1, TimeUnit.SECONDS);
执行程序将每秒调整此任务,并且还可以返回可用于取消或获取结果的ScheduledFuture(如果使用Callable而不是runnable)。
编辑:CPerkins提出了一个很好的观点。 我们如何在一段时间后取消然后重新执行。 这有点多,但我认为它完成了工作。
final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); final ExecutorService executor = Executors.newFixedThreadPool(1); public void execute(){ executor.submit(scheduleTask()); } public Runnable scheduleTask(){ return new Runnable() { public void run() { final ScheduledFuture cancel = scheduler.scheduleAtFixedRate(new Runnable() { public void run() { // do work here } }, 0, 1, TimeUnit.SECONDS); scheduler.schedule(new Runnable() { public void run() { cancel.cancel(true); execute(); } }, 1, TimeUnit.MINUTES); } }; }
像这样写你的线程的run方法
public void run(){ while (true){ if (condition){ // your logic } java.lang.Thread.sleep(1000L); } }
在上面的代码中,循环是一个无限循环,它将每秒执行一次(1000毫秒),只有满足条件才会执行逻辑。
如果要将暂停时间增加到2秒,请将1000L
更改为2000L
我只能给你一些建议。 你可以设置一个像isThreadRunning这样的标志,然后当那个标志为真时,运行循环,如果不是,你就退出循环。 关于再次运行循环,我认为你可以为此创建一个新的线程。 这是一些代码片段:
public class A extends Thread { public boolean isThreadRunning = true; public void run() { while(isThreadRunning) { // do task } } }
当某个时间发生,或者另一个线程想要停止该线程时,你可以调用A.isThreadRunning = false;
- JAX-RS NoMessageBodyWriterFoundFailure
- 在JTable的单个列上显示MySQL数据库中的图像
- (Libgdx 1.6.1)由于索引超出范围,BitmapFontCache.draw崩溃
- 通过注释和xml上下文连接Spring bean
- 多个JVM与单个应用服务器
- 是否需要同步构造函数中非线程安全集合的变异?
- Java 2D Imageresize忽略双三次/双线性插值渲染提示(OS X + linux)
- 如何使用mapStruct映射使用@XMLSeeAlso注释的JAXB元素?
- 如何在Spring’HandlerMethodArgumentResolver’中多次读取请求体?