scheduleAtFixedRate立即执行任务,应在定义的延迟后运行。

时间:2016-10-26 08:02:12

标签: java multithreading concurrency

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

class MyTask1 implements Runnable{
MyTask1(){
    new Thread(this).start();
}
public void run(){
    System.out.println("Running");
}
}
public class Schedular_1 {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    ScheduledExecutorService ex = Executors.newScheduledThreadPool(1);
    ex.scheduleAtFixedRate(new MyTask1(), 3, 10, TimeUnit.SECONDS); 
  }

 }

scheduleAtFixedRate的第一次运行是在我们在第二个参数中定义的延迟后预期的。并且随后的执行必须由第三参数定义,即每10秒。但实际上它(MyTask1)在我调用main方法时立即运行。 3秒后执行第2次,每10秒执行一次。

我得到了另一个版本,在这里工作得很好(link)。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

class MyTask1 implements Runnable{
MyTask1(){
    new Thread(this).start();
}
public void run(){
    System.out.println("Running");
}
}
public class Schedular_1 {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    ScheduledExecutorService ex = Executors.newScheduledThreadPool(1);
    ex.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            System.out.println("Testing...");
        }
    }, 3, 10, TimeUnit.SECONDS);
}

}

这两个检验之间有什么区别。为什么它表现异常?

2 个答案:

答案 0 :(得分:1)

代码中的问题是你在构造函数中启动一个Thread:

MyTask1(){
    new Thread(this).start();
}

执行scheduleAtFixedRate时,您正在创建一个新实例并启动一个新线程。然后ExecutorService按预期运行任务。

在第二个版本中,您定义了一个实现Runnable的匿名类。您没有自己启动该线程,代码按预期工作。

答案 1 :(得分:1)

您不需要在Thread中启动MyTask1MyTask1的正确版本将是:

class MyTask1 implements Runnable{
    MyTask1(){
    }
    public void run(){
        System.out.println("Running");
    }
}