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

标签 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 秒一次。但实际上,一旦我调用 main 方法,它(MyTask1)就会立即运行。 3 秒后,它会执行第二次,并且每 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);
}

}

这两个版本之间有什么区别。为什么它的行为异常?

最佳答案

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

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

关于java - ScheduleAtFixedRate 立即执行任务,应在定义的延迟后运行。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40256804/

相关文章:

java - 嵌套同步块(synchronized block)

java - 使用鼠标在两点之间移动

java - ConcurrentLinkedQueue 上的迭代器不会迭代到下一个值

java - java中如何使用Lock指定要锁定的对象

java - 如何部署带有嵌入式 JavaDB 数据库的 Java Swing 应用程序?

java - 使用java生成pdf文件

java - 如何使用 GridLayout 或 GridBagLayout 垂直填充 JPanel?

python - 为了提高我的 python 程序的速度,我应该生成一个单独的线程还是一个单独的进程来进行日志记录?

java - 一次从多个套接字接收数据(多线程)

非 volatile 对象中的java volatile 对象