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

时间:2010-05-18 05:53:18

标签: java multithreading

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

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

5 个答案:

答案 0 :(得分:12)

Java有一个内置的机制,让线程做一些事情,然后等待一段时间再做一次,称为Timer。您可以将循环内部的内容放在Run()的{​​{1}}方法中,然后告诉计时器您希望它完成的频率。

TimerTask

当程序完成时,关闭它当然是你的工作。

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

答案 1 :(得分:6)

假设你在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,它支持开箱即用的取消。

答案 2 :(得分:6)

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

您可以使用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);
        }
    };
}

答案 3 :(得分:0)

我只能给你一些建议。您可以设置像isThreadRunning这样的标志,然后当该标志为true时,运行循环,如果不是,则退出循环。关于再次运行循环,我认为你可以为此创建一个新的线程。以下是一些代码段:

public class A extends Thread {
  public boolean isThreadRunning = true;
  public void run() {
    while(isThreadRunning) {
    // do task
    }    
  }
}

当某个时间发生,或者另一个线程想要停止该线程时,您可以直接调用 A.isThreadRunning = false;

答案 4 :(得分:0)

像这样编写你的线程的run方法

public void run(){
   while (true){
       if (condition){
          // your logic
       }
       java.lang.Thread.sleep(1000L);
   }
}

在上面的代码中,循环是一个无限循环,每秒执行一次(1000毫秒),只有满足条件才会执行逻辑。

如果您想将暂停时间增加到2秒,请将1000L更改为2000L