寻找一种解决多线程问题的方法。 我有N个任务,例如100个。我需要使用有限数量的线程(例如4个)来运行这100个任务。任务规模巨大,所以我不想一起创建所有任务。仅当池中有可用线程时,才会创建每个任务。任何建议的解决方案。
答案 0 :(得分:1)
如果可以从线程池中获取某个时间点的活动线程数,则可以解决您的问题。为此,您可以使用ThreadPoolExecutor#getActiveCount
。一旦有了活动线程的编号,就可以决定是否创建任务。
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
executor.getActiveCount();
注意:ExecutorService不提供
getActiveCount
方法,您 必须使用ThreadPoolExecutor
。ThreadPoolExecutor#getActiveCount
返回活跃的线程数approximate
执行任务。
答案 1 :(得分:1)
您可以使用BlockingQueue来定义任务。让一个线程创建任务,然后使用put
将其添加到队列中,该任务将阻塞直到队列中没有空间。然后让每个工作线程仅将下一个任务从队列中拉出。队列的阻塞性质将基本上迫使(定义任务的)第一个线程不会超前于工作线程。
这实际上只是producer-consumer pattern的一种情况,其中生产和消费的东西是做某项工作的要求。
所有工作完成后,您需要指定某种方法使整个过程完成。一种方法是在生成线程创建所有任务后,将N个“毒药”放入队列。这些是特殊的任务,仅告诉工作线程退出(而不是做一些工作然后要求下一个项目)。由于每个线程最多只能读取一个毒药(因为它在读取毒药后会退出),并且将N个毒药放入队列中,因此,您将确保N个线程中的每一个都只能看到一个毒药。 >
请注意,如果任务生成线程消耗了资源(例如用于读取任务的数据库连接),则将保留这些资源,直到生成所有任务为止-这可能要花一些时间!通常这不是一个好主意,因此在这种情况下,这种方法也不是一个好方法。