Java ScheduledExecutorService一个线程多个任务
我不熟悉执行器服务,不知道为什么下面的代码会正确打印“10 15”,尽管我只创建了一个线程来处理超时?为什么我可以多次调用schedule而不在单个线程执行器上取消以前的任务Java ScheduledExecutorService一个线程多个任务,java,multithreading,timer,executorservice,scheduledexecutorservice,Java,Multithreading,Timer,Executorservice,Scheduledexecutorservice,我不熟悉执行器服务,不知道为什么下面的代码会正确打印“10 15”,尽管我只创建了一个线程来处理超时?为什么我可以多次调用schedule而不在单个线程执行器上取消以前的任务 import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class TestExecutorServ
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class TestExecutorService implements Runnable {
public static ScheduledExecutorService SERVICE = Executors.newSingleThreadScheduledExecutor();
private int delay;
public TestExecutorService(int delay) {
this.delay = delay;
}
public void run () {
System.out.println(delay);
}
public static void main (String[] args) {
SERVICE.schedule(new TestExecutorService(10), 10, TimeUnit.SECONDS);
SERVICE.schedule(new TestExecutorService(15), 15, TimeUnit.SECONDS);
SERVICE.shutdown();
}
}
在这种情况下,阅读文章将非常有帮助。它确实解释了,尽管执行器将使用单个线程创建,但它将使用无界队列进行操作。这意味着您可以向执行器提交多个任务,它们将排队依次运行,直到队列的最大边界(在本例中为无限)或JVM耗尽资源为止
创建一个执行器,该执行器使用单个辅助线程在
无限队列。(但是请注意,如果此单线程终止
由于关机前执行过程中出现故障,将出现新的故障
如果需要执行后续任务,则替换它。)任务
保证按顺序执行,并且最多只能执行一个任务
在任何给定时间都处于活动状态。不同于其他等价物
newFixedThreadPool(1)保证返回的执行器不会
可重新配置以使用其他线程
在您的示例中,两个任务排队,并依次运行,这就是您获得(预期)输出的原因。来自:
任务保证按顺序执行,并且在任何给定时间都不会有多个任务处于活动状态
“处理超时”和“任务执行”之间的区别是答案的关键。您假设“单线程”意味着“一次只处理一个超时”,但它实际上意味着“一次只执行一个任务”。所有超时都是同时处理的,但如果在一个任务停止执行之前达到一个超时,则必须等待另一个超时完成后才能执行。因此,如果提交了许多具有相同延迟的任务,则其中一些任务会晚得多打印?@NikolayKuznetsov是的,他们会,假设任务需要足够长的时间让你注意到。额外阅读