【问题标题】:Restricting thread count and Java concurrency限制线程数和 Java 并发
【发布时间】:2013-01-17 04:06:30
【问题描述】:

我找不到使用最新 JAVA 并发例程的这种特定情况的示例。

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

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

【问题讨论】:

  • 查看java.util.concurrent 包。如果没有一款适合您开箱即用,那么您可以随时将其包装起来......
  • "有不少于0",你的意思是你不想要负数的线程吗? ;)

标签: java multithreading concurrency java.util.concurrent


【解决方案1】:

我认为线程池是您正在寻找的。看看 ExecutorService 和 Executors。

执行服务: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 传递给 Pool。

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

这是一个非常小的教程:http://www.math.uni-hamburg.de/doc/java/tutorial/essential/threads/group.html

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

未来:http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html

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

【讨论】:

  • +1 固定线程池也有队列所以不需要添加。
  • 是的,你说得对,我不是这么想的,只是觉得请求队列还存在。
【解决方案2】:

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

如果你使用 X = 10 Worker 线程,那么你的任务就解决了。

【讨论】:

    【解决方案3】:

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

    http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html

    【讨论】:

      【解决方案4】:

      如果您实际上无权创建线程,而您只管理队列访问,则解决方案可能只是使用Semaphore 对象(请参阅docs page)。

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

      在访问队列以进行项目处理之前,线程将首先 acquire 来自信号量的许可,如果 max_threads 数量的线程已经开始处理队列中的项目,则会阻塞。

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-09-14
        • 1970-01-01
        • 2015-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多