java 多线程 - 等待空闲线程可用以创建和分配下一个任务
java multithreading -Wait for free threads availability to create and assign next task
寻找解决多线程问题的方法。
我有 N 个任务,比如说 100。我需要 运行 这 100 个任务使用有限数量的线程,比如说 4。任务规模很大,所以我不想一起创建所有任务。仅当池中有可用线程时才会创建每个任务。 任何推荐的相同解决方案。
如果能从线程池中获取某个时间点的活跃线程数就可以解决你的问题。为此,您可以使用 ThreadPoolExecutor#getActiveCount
。一旦你有了活动线程的数量,你就可以决定你是否应该创建一个任务。
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
executor.getActiveCount();
Note: ExecutorService does not provide getActiveCount
method, you
have to use ThreadPoolExecutor
. ThreadPoolExecutor#getActiveCount
Returns the approximate
number of threads that are actively
executing tasks.
您可以使用 BlockingQueue to define the tasks. Have one thread create the tasks and add them to the queue using put
,它会阻塞直到队列中有 space。然后让每个工作线程从队列中拉出下一个任务。队列的阻塞性质基本上会迫使第一个线程(定义任务)不要超前于工人太远。
这实际上只是 producer-consumer pattern 的一个例子,其中生产和消费的东西是做一些工作的请求。
您需要指定某种方式让整个工作在完成所有工作后完成。一种方法是在生成线程创建所有任务后将 N "poison pills" 放入队列。这些特殊任务只是告诉工作线程退出(而不是做一些工作然后请求下一项)。由于每个线程最多只能读到一个毒丸(因为读完就退出),而你把N个毒丸放到队列中,你就可以保证你的N个线程每一个都恰好看到一个毒丸。
请注意,如果任务生成线程消耗资源,例如从中读取任务的数据库连接,这些资源将被保留,直到所有任务都已生成——这可能需要一段时间!这通常不是一个好主意,因此在这些情况下这种方法不是一个好方法。
寻找解决多线程问题的方法。 我有 N 个任务,比如说 100。我需要 运行 这 100 个任务使用有限数量的线程,比如说 4。任务规模很大,所以我不想一起创建所有任务。仅当池中有可用线程时才会创建每个任务。 任何推荐的相同解决方案。
如果能从线程池中获取某个时间点的活跃线程数就可以解决你的问题。为此,您可以使用 ThreadPoolExecutor#getActiveCount
。一旦你有了活动线程的数量,你就可以决定你是否应该创建一个任务。
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
executor.getActiveCount();
Note: ExecutorService does not provide
getActiveCount
method, you have to useThreadPoolExecutor
.ThreadPoolExecutor#getActiveCount
Returns theapproximate
number of threads that are actively executing tasks.
您可以使用 BlockingQueue to define the tasks. Have one thread create the tasks and add them to the queue using put
,它会阻塞直到队列中有 space。然后让每个工作线程从队列中拉出下一个任务。队列的阻塞性质基本上会迫使第一个线程(定义任务)不要超前于工人太远。
这实际上只是 producer-consumer pattern 的一个例子,其中生产和消费的东西是做一些工作的请求。
您需要指定某种方式让整个工作在完成所有工作后完成。一种方法是在生成线程创建所有任务后将 N "poison pills" 放入队列。这些特殊任务只是告诉工作线程退出(而不是做一些工作然后请求下一项)。由于每个线程最多只能读到一个毒丸(因为读完就退出),而你把N个毒丸放到队列中,你就可以保证你的N个线程每一个都恰好看到一个毒丸。
请注意,如果任务生成线程消耗资源,例如从中读取任务的数据库连接,这些资源将被保留,直到所有任务都已生成——这可能需要一段时间!这通常不是一个好主意,因此在这些情况下这种方法不是一个好方法。