Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有比使用Thread.sleep()更好的方法?_Java_Multithreading - Fatal编程技术网

Java 有没有比使用Thread.sleep()更好的方法?

Java 有没有比使用Thread.sleep()更好的方法?,java,multithreading,Java,Multithreading,我有一个线程,在一定的时间间隔后,定期在后台执行一些任务 然而,我想要控制线程何时终止,下面是我如何实现它的 class Task extends Thread { private boolean kill= false,repeat = false; public void kill() { kill = true; } public void repeat() { repeat = true; } public void run() { do

我有一个线程,在一定的时间间隔后,定期在后台执行一些任务

然而,我想要控制线程何时终止,下面是我如何实现它的

class Task extends Thread { 
  private boolean kill= false,repeat = false;
  public void kill() {
    kill = true;
  }
  public void repeat() {
    repeat = true;
  }
  public void run() {
    do {
      //wait until the required time has elapsed
      while(!isTimeElapsed() && !kill) {
       Thread.sleep(1000);
      }
      if(!kill) {
      //time to work, do stuff
      }
    } while(repeat & !kill);
  }
}
代码按照我的要求工作,但Netbeans通知我说,“在循环中调用Thread.sleep()可能会导致性能问题。”。但这并不意味着有更好的方法来做我想做的事情


但是,有没有更好的方法来完成我想要的任务,即让线程等待固定的时间,但也可以灵活地随时终止线程?

这将创建类的实例,并每1秒运行一次

Timer timer = new Timer();
TimerTask myTask = new MyTask();
timer.schedule(myTask,1000,1000);

MyTask需要扩展TimerTask而不是线程。

这将创建类的实例,并每1秒运行一次

Timer timer = new Timer();
TimerTask myTask = new MyTask();
timer.schedule(myTask,1000,1000);

MyTask需要扩展TimerTask而不是线程。

下面是一个基本示例,演示如何使用它们:

import java.util.Timer;
import java.util.TimerTask;

public class Greeter {
   private static class SayHello extends TimerTask {
      @Override
      public void run() {
         System.out.println("Hello");
      }
   }
   public static void main(String[] args) throws InterruptedException {
      Timer t = new Timer();
      int delay = 0;
      int period = 1000; // milliseconds
      t.scheduleAtFixedRate(new SayHello(), delay, period);

      Thread.sleep(5000); // Do something

      t.cancel();
   }
}

下面是一个基本示例,演示如何使用它们:

import java.util.Timer;
import java.util.TimerTask;

public class Greeter {
   private static class SayHello extends TimerTask {
      @Override
      public void run() {
         System.out.println("Hello");
      }
   }
   public static void main(String[] args) throws InterruptedException {
      Timer t = new Timer();
      int delay = 0;
      int period = 1000; // milliseconds
      t.scheduleAtFixedRate(new SayHello(), delay, period);

      Thread.sleep(5000); // Do something

      t.cancel();
   }
}

我建议您查看
Timer
TimerTask
,看看这是否能完成您想要完成的任务。有许多很好的网站解释了它们的使用方法。旁注:
repeat
kill
应该是不稳定的。@JeffWard谢谢。这些课程正是我需要的。@Assylas我总是犯那个错误。感谢您的更正。
重复
杀死
肯定应该是
易失的
。我不会担心性能,除非有大量线程都处于休眠状态。我建议查看
Timer
TimerTask
,看看这是否能完成您试图完成的任务。有许多很好的网站解释了它们的使用方法。旁注:
repeat
kill
应该是不稳定的。@JeffWard谢谢。这些课程正是我需要的。@Assylas我总是犯那个错误。感谢您的更正。
重复
杀死
肯定应该是
易失的
。我不会担心性能,除非有大量线程都在休眠。你应该使用ScheduledExecutorService。计时器只使用一个线程,因此如果任务足够长,它可能会延迟下一个线程。您应该使用ScheduledExecutorService。计时器只使用一个线程,因此如果任务足够长,它可能会延迟下一个线程。