scheduledThreadPool如何在这里工作?

时间:2014-04-18 12:34:09

标签: java multithreading scheduling

创建包含5个核心线程的scheduledThreadPool

 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);

现在我的应用程序同时为十个任务调用scheduledThreadPool

 scheduledThreadPool.schedule(myTask, 0, TimeUnit.SECONDS);

我的问题是,scheduleThreadPool会选择5个任务并先完成它们。然后它会挑选剩下的5个?

3 个答案:

答案 0 :(得分:0)

Short Asnwer

您的shcedulerTreadPool将选择前5个任务并将其他5个任务排入队列。然后当其中一个当前忙线程退出下一个任务时,将调度到该线程

换句话说

你的schedulerTread pool每秒都会保存5个线程。通过内部队列将任务提交到池中,只要存在比线程更多的活动任务,它就会保存额外的任务(对于当前运行的5个任务以上的所有任务)。

要回答您的问题

  1. 挑选前5个任务

  2. 每当线程完成任务时,就会为队列中的新任务分配

  3. 重复直到内部队列中有任务

答案 1 :(得分:0)

每个任务都是独立处理的,每个任务的延迟都与实际执行的任务无关。

延迟可以是0,而任务尚未启动,因为池中没有可用的线程来执行它。

在您的示例中,池将执行前5个任务,而其余5个任务等待以0延迟启动。一旦每个线程完成执行任务,它就会执行下一个任务,因为没有延迟等待。

答案 2 :(得分:0)

使用Threads执行的顺序未定义。您唯一可以确定的是,您的任务将按照添加顺序启动。但是当它们完成并且以何种顺序未定义时。

可能是Thread 1-5选择任务1-5。然后线程4首先完成并接受任务6,被线程2中断,完成任务2,但在它可以执行任务7之前,它被线程5中断,线程5完成并首先执行任务7。等等。

在单个系统和设置中可能存在一些执行命令,但是如果您运行该程序几次,则该命令可能在不同系统上甚至在同一系统上完全不同或完全混乱。