如何解决以一定间隔启动线程scheduleAtFixedRatetask,1,2,TimeUnit.SECONDS-SheduledExecutorService
有这样的示例代码
public class ExecutorsRunnableRun {
public static void main(String[] args) {
scheduledexecutorservice scheduledexecutorservice =
Executors.newScheduledThreadPool(4);
IntStream.range(0,7).forEach(
i -> {
Task task = new Task(i);
scheduledexecutorservice.scheduleAtFixedrate(task,1,2,TimeUnit.SECONDS);
}
);
scheduledexecutorservice.shutdown();
try {
scheduledexecutorservice.awaitTermination(1000,TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printstacktrace();
}
}
private static class Task implements Runnable {
private final int idThread;
private Task(int idThread) {
this.idThread = idThread;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() +
": is launched in iteration № " + this.idThread);
}
}
我想看到一个线程将延迟一秒钟运行(相对于我们为线程指向任务的那一刻,但现在我们并不会在一段时间内运行它)
然后,线程必须执行任务,但要持续2秒钟。
线程必须执行14次任务,同时线程将重用线程池中的那些线程。
是吗?
scheduleAtFixedrate(task,TimeUnit.SECONDS)
据我了解,应用程序启动后,第一个线程不会立即启动,而是在1秒后启动,然后执行任务。
相同的任务将在2秒内再次完成。
然后,在下一次迭代中,重复该算法。
因此,对于每次迭代,每个线程将完成任务-2次。
是吗?
但是线程没有时间运行,应用程序停止了。
为什么?
为了了解这种机制的工作原理,我不得不延迟创建任务。
IntStream.range(0,7).forEach(
i -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printstacktrace();
}
Task task = new Task(i);
scheduledexecutorservice.scheduleAtFixedrate(task,TimeUnit.SECONDS);
}
);
然后我看不到这样的计划者要点。
谁知道,请解释这种机制。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。