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);
}
}
这两个检验之间有什么区别。为什么它表现异常?
答案 0 :(得分:1)
代码中的问题是你在构造函数中启动一个Thread:
MyTask1(){
new Thread(this).start();
}
执行scheduleAtFixedRate
时,您正在创建一个新实例并启动一个新线程。然后ExecutorService按预期运行任务。
在第二个版本中,您定义了一个实现Runnable的匿名类。您没有自己启动该线程,代码按预期工作。
答案 1 :(得分:1)
您不需要在Thread
中启动MyTask1
。
MyTask1
的正确版本将是:
class MyTask1 implements Runnable{
MyTask1(){
}
public void run(){
System.out.println("Running");
}
}