构建受控java线程队列
这是我的情况。我必须运行X次搜索(10-200次之间),获得每个搜索的结果并附加它们。我想给搜索添加一些并发性,但我希望能够限制它。我的意思是我不想踢的200线程,等待所有的完成。我想启动N个线程,在每个线程完成时启动一个新线程,直到所有线程都完成 我知道我可以从头开始写这篇文章,但我想知道是否有一个简单的模式或库已经存在?我讨厌重新创造轮子构建受控java线程队列,java,multithreading,Java,Multithreading,这是我的情况。我必须运行X次搜索(10-200次之间),获得每个搜索的结果并附加它们。我想给搜索添加一些并发性,但我希望能够限制它。我的意思是我不想踢的200线程,等待所有的完成。我想启动N个线程,在每个线程完成时启动一个新线程,直到所有线程都完成 我知道我可以从头开始写这篇文章,但我想知道是否有一个简单的模式或库已经存在?我讨厌重新创造轮子 谢谢。java.util.Concurrent中的executor框架是创建线程池并在其上调度任务的标准方法。您将创建一个具有多个线程的java.util
谢谢。java.util.Concurrent中的executor框架是创建线程池并在其上调度任务的标准方法。您将创建一个具有多个线程的
java.util.concurrent.ThreadPoolExecutor
,并在其上提交Runnable
或Callable
实例(Callable
类似于Runnable,但具有返回结果的能力)。每次提交任务时,您都会得到一个Future
实例作为回报,可以将其视为指向未来结果的指针。您可以使用get()
方法查询这些未来实例是否已完成或只是执行阻塞等待。设计程序,使每个任务都是可调用的。然后,您可以从中选择最适合您的执行器。查看java.util.concurrent中的CompletionService和TimingReadPool
e、 g
private final Executor exec=new TimingThreadPool(线程数,2,10,TimeUnit.ms,
新的LinkedBlockingQueue(队列中的编号),
新的ThreadPoolExecutor.CallerRunPolicy());
私人最终完成服务=新执行人完成服务(exec);
然后每次搜索
service.submit( <a callable doing the search>);
service.submit();
说有N个
当所有人都在服务队列上发送等待结果的消息时
for (int i = 0; i < N); i++)
{
final Future<DownloadStatus> fut = service.take();
final Object d = fut.get(); // This is what the callable returns
for(int i=0;i
我想我会使用which做你想要的,除了它会重复使用线程而不是创建新的线程
您给它一个Runnable(如果您想要返回结果和/或异常,也可以调用),它将在一个线程空闲时在一个可用线程中执行该Runnable
如前所述,您可以使用Callable获得结果,但也可以使用Runnable并将结果转储到一个类似LinkedBlockingQueue的队列中。这样,您可以在线程生成结果后立即对其进行处理。谢谢。今天晚些时候我将尝试此方法。
for (int i = 0; i < N); i++)
{
final Future<DownloadStatus> fut = service.take();
final Object d = fut.get(); // This is what the callable returns