ScheduledExecutorService一个线程很多任务

时间:2012-12-18 06:54:23

标签: java multithreading timer executorservice scheduledexecutorservice

我是ExecutorService的新手并且想知道为什么下面的代码正确打印“10 15”,即使我只创建了一个线程来处理超时?为什么我可以多次调用调度而不在单个线程执行器上取消先前的任务?

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();
    }
}

2 个答案:

答案 0 :(得分:9)

在这种情况下阅读Javadoc会非常有帮助。它确实解释了虽然执行程序将使用单个线程创建,但它将使用无界队列进行操作。这意味着您可以向执行程序提交多个任务,它们将排队等候一个接一个地运行,直到队列的最大边界(在这种情况下是无穷大)或直到JVM耗尽资源。 / p>

  

创建一个Executor,它使用一个工作线程来操作   无界队列。 (但请注意,如果此单个线程终止   由于在关机之前执行期间出现故障,新的将会   如果需要执行后续任务,取而代之。)任务是   保证按顺序执行,并且不会超过一个任务   在任何给定时间都有效。不同于其他等同物   newFixedThreadPool(1)保证不返回执行者   可重新配置以使用其他线程。

在您的示例中,您的两个任务排队,并依次顺序运行,这就是您获得(预期)输出的原因。

答案 1 :(得分:9)

来自Javadocs

  

保证任务按顺序执行,任何给定时间都不会有多个任务处于活动状态。

“处理超时”和“任务执行”之间的区别是答案的关键。您假设“单线程”意味着“一次只处理一个超时”,但它实际上意味着“一次只执行一个任务”。所有超时都是同时处理的,但如果在任务停止执行之前达到一个超时,则必须等待另一个超时才能执行。