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

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

scheduleAtFixedRate的第一次运行应在我们在第2个参数中定义的延迟之后进行。后续执行必须由第三个参数ie每10秒定义一次。但实际上,只要我调用main方法,它(MyTask1)就会立即运行。3秒后,它将执行第二次,每10秒定期运行一次

我在这里找到了另一个可以正常工作的版本()


这两种说法的区别是什么。为什么它的行为异常?

代码中的问题是您正在构造函数中启动一个线程:

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();
}