Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ScheduledExecutorService一个线程多个任务_Java_Multithreading_Timer_Executorservice_Scheduledexecutorservice - Fatal编程技术网

Java ScheduledExecutorService一个线程多个任务

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

我不熟悉执行器服务,不知道为什么下面的代码会正确打印“10 15”,尽管我只创建了一个线程来处理超时?为什么我可以多次调用schedule而不在单个线程执行器上取消以前的任务

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是的,他们会,假设任务需要足够长的时间让你注意到。额外阅读