Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
构建受控java线程队列_Java_Multithreading - Fatal编程技术网

构建受控java线程队列

构建受控java线程队列,java,multithreading,Java,Multithreading,这是我的情况。我必须运行X次搜索(10-200次之间),获得每个搜索的结果并附加它们。我想给搜索添加一些并发性,但我希望能够限制它。我的意思是我不想踢的200线程,等待所有的完成。我想启动N个线程,在每个线程完成时启动一个新线程,直到所有线程都完成 我知道我可以从头开始写这篇文章,但我想知道是否有一个简单的模式或库已经存在?我讨厌重新创造轮子 谢谢。java.util.Concurrent中的executor框架是创建线程池并在其上调度任务的标准方法。您将创建一个具有多个线程的java.util

这是我的情况。我必须运行X次搜索(10-200次之间),获得每个搜索的结果并附加它们。我想给搜索添加一些并发性,但我希望能够限制它。我的意思是我不想踢的200线程,等待所有的完成。我想启动N个线程,在每个线程完成时启动一个新线程,直到所有线程都完成

我知道我可以从头开始写这篇文章,但我想知道是否有一个简单的模式或库已经存在?我讨厌重新创造轮子


谢谢。

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