Java scheduleAtFixedRate立即执行任务,应在定义的延迟后运行。
scheduleAtFixedRate的第一次运行应在我们在第2个参数中定义的延迟之后进行。后续执行必须由第三个参数ie每10秒定义一次。但实际上,只要我调用main方法,它(MyTask1)就会立即运行。3秒后,它将执行第二次,每10秒定期运行一次 我在这里找到了另一个可以正常工作的版本()Java scheduleAtFixedRate立即执行任务,应在定义的延迟后运行。,java,multithreading,concurrency,Java,Multithreading,Concurrency,scheduleAtFixedRate的第一次运行应在我们在第2个参数中定义的延迟之后进行。后续执行必须由第三个参数ie每10秒定义一次。但实际上,只要我调用main方法,它(MyTask1)就会立即运行。3秒后,它将执行第二次,每10秒定期运行一次 我在这里找到了另一个可以正常工作的版本() 这两种说法的区别是什么。为什么它的行为异常?代码中的问题是您正在构造函数中启动一个线程: import java.util.concurrent.Executors; import java.util.c
这两种说法的区别是什么。为什么它的行为异常?代码中的问题是您正在构造函数中启动一个线程:
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);
}
}
当您执行scheduleAtFixedRate时,您正在创建一个新实例并启动一个新线程。然后ExecutorService按预期运行任务
在第二个版本中,您定义了一个实现Runnable的匿名类。您自己没有启动线程,代码按预期工作。代码中的问题是您正在构造函数中启动线程:
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);
}
}
当您执行scheduleAtFixedRate时,您正在创建一个新实例并启动一个新线程。然后ExecutorService按预期运行任务
在第二个版本中,您定义了一个实现Runnable的匿名类。您自己没有启动线程,代码按预期工作。您不需要在
MyTask1
中启动thread
。
MyTask1的正确版本是:
MyTask1(){
new Thread(this).start();
}
您不需要在
MyTask1
中启动线程。
MyTask1的正确版本是:
MyTask1(){
new Thread(this).start();
}