题引:
老师有3个同类任务,需要5个同学ABCDE分别都要处理完成。老师分配任务的策略是:每个任务都是随机分配下去的,每个同学拿到任务后都要完成这个任务。
像极了做数学题时的套路,这个题目其实就属于Java多线程之任务分发的模式。
在实际工作中,如果我们遇到了“要把多个同类任务分派给Java的多个线程去执行”的场景,需要思考如下的问题:
(1)待执行的任务列表是什么?
(2)需要启动多少Java线程去执行任务?
(3)每个Java线程实际要执行多少任务?(or:任务如何分发给每个Java线程?)
思考之后,我们还需要知道,Java多线程实现这种任务分发的一般策略是什么,为了便于下文叙述方便,我们先约定:
(1)任务数为taskNum
(2)计划启动线程数为planThreadNum
(3)实际启动线程数为realThreadNum
(1)确认实际启动的线程数:
如果taskNum < planThreadNum,则实际启动taskNum个线程,即一个线程执行一个任务;
如果taskNum众多,则实际启动planThreadNum个线程即可。
(2)确定每个线程执行的任务数:
如果taskNum < planThreadNum,每个线程都只执行一个任务;
如果taskNum众多,则先将taskNum按planThreadNum均分,余下的任务从前至后依次附加到线程中即可。
现在,我们既知道