如何设置无限循环并打破它.(Java线程)

Nub*_*iya 5 java multithreading

我已经设置了一个线程,我想使用循环运行它.所以这个线程应该在循环中运行并在一定时间内中断并再次运行循环.

请不要知道如何做到这一点.有人可以指导我

Aff*_*ffe 14

Java有一个内置的机制,让线程做一些事情,然后等待一段时间再做一次,调用Timer.你可以将循环中的内容放在a的Run()方法中TimerTask,然后告诉计时器你想要它完成的频率.

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
Run Code Online (Sandbox Code Playgroud)

在程序完成时关闭它当然是你的工作.

http://java.sun.com/javase/6/docs/api/java/util/Timer.html


mdm*_*dma 8

假设您正在使用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
Run Code Online (Sandbox Code Playgroud)

或者,使用java.util.concurrent.Future和FutureTask,它支持开箱即用的取消.


Joh*_*int 6

我觉得我们错过了执行官!

您可以使用ScheduledExecutorService来运行任务,然后在一段固定的时间后再次运行.它类似于TimerTask,但更易于管理和更好地维护.

private final ScheduledExecutorService scheduler = 
                           Executors.newScheduledThreadPool(1);
 scheduler.scheduleAtFixedRate(new Runnable() {
            public void run() {
                //do work here  
            }
    }, 1, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

Executor每秒都会调整此任务,并且还可以返回一个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 Code Online (Sandbox Code Playgroud)