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_Concurrency_Java.util.concurrent - Fatal编程技术网

限制线程数和Java并发性

限制线程数和Java并发性,java,multithreading,concurrency,java.util.concurrent,Java,Multithreading,Concurrency,Java.util.concurrent,我找不到一个使用最新JAVA并发例程的具体例子 我计划使用线程来处理开放队列中的项目,该队列可能包含0到数千个请求。我想限制在任何给定时间处理队列项目的线程不少于0个,也不超过10个 是否有针对这种特定类型案例的Java并发流程?我有同样的任务: 我使用了java.util.concurrent包的BlockingQueue。我创建了X个工作线程,它从队列中读取一个操作,处理它,并在准备就绪时执行下一个操作。这很简单,而且效果很好。 如果您使用X=10个工作线程,那么您的任务就完成了。看起来您需

我找不到一个使用最新JAVA并发例程的具体例子

我计划使用
线程
来处理开放队列中的项目,该队列可能包含0到数千个请求。我想限制在任何给定时间处理队列项目的线程不少于0个,也不超过10个

是否有针对这种特定类型案例的Java并发流程?

我有同样的任务: 我使用了
java.util.concurrent
包的
BlockingQueue
。我创建了X个工作线程,它从队列中读取一个操作,处理它,并在准备就绪时执行下一个操作。这很简单,而且效果很好。


如果您使用X=10个工作线程,那么您的任务就完成了。

看起来您需要一个corePoolSize=0和maximumPoolSize=10的线程池执行器


我认为线程池是您需要的。看看ExecutorService和Executors

执行人服务:

遗嘱执行人:

获取一个新的线程固定线程池,该线程池一次最多处理10个线程:

ExecutorService threadPool = Executors.newFixedThreadPool(10);
使用submit方法,可以将可调用项或可运行项传递给池

对于您的用例,您需要一个查看队列的进程,如果有新请求,则必须创建一个可调用或可运行的进程,并将其传递给线程池。该池确保一次最多执行10个线程

这是一个非常小的教程:

使用线程池的一个好方法是submit方法返回一个Future对象,该对象支持已执行线程的返回类型

未来:


我希望这能帮助您解决问题。

如果您实际上没有创建线程的权限,并且您只管理队列访问,那么解决方案可以是使用
信号量
对象(请参阅)

其思想是将一个全局信号量初始化为数量
max\u threads
(比如10),该信号量的访问方式与访问队列的方式相同

在访问队列进行项目处理之前,线程将首先从信号量获得许可证,如果
max_threads
个线程已经开始处理队列中的项目,则该许可证将被阻止

在一个项目被某个线程处理后,该线程最终应该获得许可,从而允许更多线程处理其他项目

请注意,应该使用try-finally块来获取/释放许可证,这样即使在项目处理中引发了一些异常,信号量仍保持一致状态。代码应该如下所示:

semaphore.acquire().
try {
    // retrieve item from queue and process it
}
finally {
    semaphore.release();
}

看看包裹。如果没有现成的适合您的线程,那么您可以将其包装起来……“线程数不小于0”,您的意思是不希望线程数为负数吗?;)+1固定线程池也有一个队列,因此您不需要添加一个。是的,您是对的,我不这么认为,只是认为请求队列仍然存在。