创建包含5个核心线程的scheduledThreadPool
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
现在我的应用程序同时为十个任务调用scheduledThreadPool
scheduledThreadPool.schedule(myTask, 0, TimeUnit.SECONDS);
我的问题是,scheduleThreadPool会选择5个任务并先完成它们。然后它会挑选剩下的5个?
答案 0 :(得分:0)
Short Asnwer
您的shcedulerTreadPool
将选择前5个任务并将其他5个任务排入队列。然后当其中一个当前忙线程退出下一个任务时,将调度到该线程
换句话说
你的schedulerTread pool
每秒都会保存5个线程。通过内部队列将任务提交到池中,只要存在比线程更多的活动任务,它就会保存额外的任务(对于当前运行的5个任务以上的所有任务)。
要回答您的问题
挑选前5个任务
每当线程完成任务时,就会为队列中的新任务分配
重复直到内部队列中有任务
答案 1 :(得分:0)
每个任务都是独立处理的,每个任务的延迟都与实际执行的任务无关。
延迟可以是0
,而任务尚未启动,因为池中没有可用的线程来执行它。
在您的示例中,池将执行前5个任务,而其余5个任务等待以0
延迟启动。一旦每个线程完成执行任务,它就会执行下一个任务,因为没有延迟等待。
答案 2 :(得分:0)
使用Threads执行的顺序未定义。您唯一可以确定的是,您的任务将按照添加顺序启动。但是当它们完成并且以何种顺序未定义时。
可能是Thread 1-5选择任务1-5。然后线程4首先完成并接受任务6,被线程2中断,完成任务2,但在它可以执行任务7之前,它被线程5中断,线程5完成并首先执行任务7。等等。
在单个系统和设置中可能存在一些执行命令,但是如果您运行该程序几次,则该命令可能在不同系统上甚至在同一系统上完全不同或完全混乱。