gpt4 book ai didi

java - 使用 executor.scheduleAtFixedRate 方法时 Future.isDone() 不显示状态更改

转载 作者:行者123 更新时间:2023-12-01 08:49:30 26 4
gpt4 key购买 nike

嗨,我是并发新手,所以我编写了一个非常基本的程序来查看线程完成时 future.isDone() 方法是否显示 true,不幸的是,当我使用 ScheduledAtFixedRate 方法安排任务时,它总是显示“false” 。但是,如果我使用计划方法,它会显示“true”,当然简单任务不会在几秒钟后重新运行。任何帮助我理解为什么会出现这种情况的建议或解释将不胜感激。

谢谢!

这里是代码:

package com.company;

import org.testng.annotations.Test;

import java.util.ArrayList;
import java.util.List;

import java.util.concurrent.*;


public class Main {

public static void main(String[] args) {

Main mn = new Main();
System.out.println("Main thread started...");
mn.runobjects();
System.out.println("Main thread stopping...");
}



@Test
public void runobjects(){
List<commonrun> Obj = new ArrayList<>();
Obj.add(new TestObj1());
Obj.add(new TestObj2());
Obj.add(new TestObj3());
ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);
ScheduledFuture<?> futures1 = null;
ScheduledFuture<?> futures2 = null;
ScheduledFuture<?> futures3 = null;
int i=0;
for (commonrun obj : Obj){
if (i==0) {
futures1 = executor.schedule(() -> obj.runme(), 0, TimeUnit.SECONDS);
}
if (i==1) {
futures2 = executor.scheduleAtFixedRate(() -> obj.runme(), 0, 10, TimeUnit.SECONDS);
}
if (i==2) {
futures3 = executor.scheduleAtFixedRate(() -> obj.runme(), 0, 10, TimeUnit.SECONDS);
}
i++;
}

while(true){

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 1 is done : "+ futures1.isDone());
System.out.println("Thread 2 is done : "+ futures2.isDone());
System.out.println("Thread 3 is done : "+ futures3.isDone());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}



}
}

package com.company;

public interface commonrun {

public void runme();
}

package com.company;

public class TestObj1 implements commonrun {

static int counter = 0;
@Override
public void runme() {
System.out.println("Object 1 Starting... run : " + counter);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Object 1 Stopping... run : " + counter);
counter++;

}
}

package com.company;

public class TestObj2 implements commonrun {
@Override
public void runme() {
System.out.println("Object 2 Starting...");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Object 2 Stopping...");

}
}

package com.company;

public class TestObj3 implements commonrun {
@Override
public void runme() {
System.out.println("Object 3 Starting...");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Object 3 Stopping...");

}
}

最佳答案

ScheduledExecutorService.scheduleAtFixedRate()安排重复的任务。它永远不会(自然地)完成,所以它不会完成。来自方法的文档:

the task will only terminate via cancellation or termination of the executor

因此,只有当您调用 future.cancel()executor.terminate() 时,任务才会完成并且 future.isDone() 将返回 true

虽然人们可能期望一旦第一个任务执行完成,future就会完成,但事实并非如此,原因如下:

  1. 一旦 future 完成,就无法“撤消”(“done”是 future 的最终状态),因此 isDone 无法报告重复作业的当前执行状态
  2. 一旦 future 完成,取消它就没有意义了(没有什么可以取消的)——这不适合重复性任务,在取消之前不会无限期地运行。

关于java - 使用 executor.scheduleAtFixedRate 方法时 Future.isDone() 不显示状态更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42471881/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com