- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
嗨,我是并发新手,所以我编写了一个非常基本的程序来查看线程完成时 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
就会完成,但事实并非如此,原因如下:
isDone
无法报告重复作业的当前执行状态关于java - 使用 executor.scheduleAtFixedRate 方法时 Future.isDone() 不显示状态更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42471881/
我尝试每小时执行一次代码 这是针对applicationRunner中的java,可以在服务器启动时运行。 @Component public class TestApplicationRunner
我在程序中使用方法scheduleAtFixedRate(Timer类)。它每秒运行一次,但有时此方法变得非常快(每秒执行 3 - 4 次)。 但是我在网络上做了一些研究,发现了这个: 从 Andro
日志: [pool-1-thread-1] TRACE apns.ApnsPushConnection - 输入方法 queryFeedbackService 参数[pool-3-thread-1]
我正在阅读一本 java8 书籍,发现了 ScheduleAtFixedRate 和 ScheduledExecutorService 中的 scheduleWithFixedDelay 方法之间的区
我们需要通过 Java 程序关注 PC 时钟。为此,我们每 500 毫秒使用 ScheduleAtFixedRate() 调度一个 Runnable。我们每次都从中调用 System.currentT
我正在编写一个应用程序,它生成随机数并在 Android 屏幕上显示它们(一个接一个)。这是 Activity java fragment 。 public class Scada extends A
public class MyTimerTask extends TimerTask{ @Override public void run() { int i = 0;
我有一个 Java 应用程序,用于通过 UART 连接 (RS422) 与嵌入式设备通信。主机以 5 毫秒为间隔向微 Controller 查询数据。直到最近我一直在使用 ScheduledExecu
我有 TextView 来频繁更新时间,工作正常,但问题是我想根据不同的条件更改计划时间,但我无法更改计划时间。它继续在最初设置的时间。 private Long mPeriod = Long.par
我正在研究 Java 类 ScheduledExecutorService 的 scheduleAtFixedRate 方法。 这是我的可疑代码: ScheduledExecutorService s
import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import
我正在尝试使用 ScheduledExecutorService 类的方法 scheduleAtFixedRate 进行示例。代码是: ScheduledExecutorService service
我创建了一个可运行的类并创建了一个线程,但具有唯一的名称,但是当我通过 executor.scheduleAtFixedRate 发送该线程时,它创建了自己的线程,我不明白这是为什么? 我试着阅读这里
当我定期执行一项耗时的任务时,结果没有达到我的预期。 public static void main(String[] args) { ScheduledExecutorService sch
我正在使用ScheduledExecutorService使用 scheduleAtFixedRate 方法每小时提供一次数据库更新。问题是它逐渐变得更晚 - 在长期服务中我一直在记录它并且每天大约一
这是我的固定速率计时器代码。当 Activity 进入 onPause(); 时,我可以暂停这个计时器吗?如果是这样,那么您建议我在 onPause(); 方法中放入什么,当应用程序进入 onResu
Runnable runPickWinner = new Runnable() { @Override public void run() {
因为我每秒都在执行时间紧迫的任务,所以我比较了几种方法以找到确保我的任务真正以固定时间步长执行的最佳方法。在计算所有方法的误差标准推导后,似乎使用方法 scheduledExecutorService
final Runnable refresh = new Refresh(params...); service = Executors.newScheduledThreadPool(1); serv
我的代码是: ou=100 final Timer t=new Timer(); TimerTask tt=new TimerTask() { @Overrid
我是一名优秀的程序员,十分优秀!