繁体   English   中英

限制线程数和Java并发

[英]Restricting thread count and Java concurrency

我找不到使用最新的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

获取一个新的Thread固定线程池,该线程池可处理的最大线程数。 一次10个线程:

ExecutorService threadPool = Executors.newFixedThreadPool(10);

使用Submit方法,您可以将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对象(请参阅docs页面 )。

这个想法是要以与访问队列相同的方式访问全局信号量,将其初始化为数量max_threads (例如10)。

访问用于项目处理队列之前,一个线程会首先获得来自信号,如果这将阻止许可证max_threads线程数量已经从队列中开始处理项目。

在某个项目由某个线程处理后,该线程最终应释放许可,从而允许更多线程处理其他项目。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM