限制线程数和Java并发
我找不到使用最新JAVA并发例程的这种特定情况的示例。
我计划使用threads
处理来自开放队列的项目,该队列可能包含0到数千个请求。 我想限制所以在任何给定的时间不少于0并且不超过10个线程处理队列项。
是否有针对此特定类型案例的Java并发流程?
我认为线程池是您正在寻找的。 看一下ExecutorService和Executors。
ExecutorService: http : //docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html
执行人: http : //docs.oracle.com/javase/6/docs/api/java/util/concurrent/Executors.html
获取一个处理最大值的新线程修复线程池 10个线程一次:
ExecutorService threadPool = Executors.newFixedThreadPool(10);
使用提交方法,您可以将Callables或Runnables传递给池。
对于您的用例,您需要一个查看队列的进程,如果有新请求,则必须创建Callable或Runnable并将其传递给线程池。 游泳池确保最大化 一次执行10个线程。
这是一个非常小的教程: http : //www.math.uni-hamburg.de/doc/java/tutorial/essential/threads/group.html
使用线程池的一个好处是submit方法返回一个Future对象,它支持执行线程的返回类型。
未来: http : //docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html
我希望这可以帮助您解决问题。
我有同样的任务:我使用了java.util.concurrent
包的BlockingQueue
。 我创建了X工作线程,它从队列中读取一个动作,处理它,并在准备好时接下一个。 这很简单,而且工作正常。
如果您使用X = 10个工作线程,那么您的任务就会解决。
看起来你需要一个corePoolSize = 0和maximumPoolSize = 10的线程池执行器。
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html
如果您实际上无法访问线程的创建,并且只管理队列访问,则解决方案可能只是使用Semaphore
对象(请参阅文档页面 )。
这个想法是为了一个全局信号量,以与访问队列相同的方式访问,被初始化为数字max_threads
(比方说,10)。
在访问队列进行项目处理之前,线程首先从信号量获取许可证,如果max_threads
线程数已经开始处理队列中的项目,则会阻止该许可证。
在某个线程处理某个项目之后,该线程应该最终释放许可证,从而允许更multithreading处理其他项目。
注意,许可的获取/释放应该使用try-finally块来完成,这样即使从项处理中抛出一些exception,信号量仍然保持一致状态。 代码应如下所示:
semaphore.acquire(). try { // retrieve item from queue and process it } finally { semaphore.release(); }