限制生成的线程数

时间:2013-11-01 18:39:24

标签: java multithreading threadpoolexecutor

我遇到了一个问题,我希望大师可以帮忙。

我正在设计一个多线程Java应用程序,我想在任何时候将生成的线程数量限制为5。 main()程序应该暂停并等到池中的线程可用,直到恢复它的进程。

目前这就是我的想法,但似乎我检测活动线程数的方式不是很准确。

只是想知道是否有另一种方法可以做到这一点。

ExecutorService pool = Executors.newFixedThreadPool(5);

for(int i=0; i<10000; i++){    
  System.out.println("current number of threads: "+((ThreadPoolExecutor)pool).getActiveCount());

  while(true){
      if (((ThreadPoolExecutor)pool).getActiveCount() < 5)
          break;
      Thread.sleep(TimeUnit.SECONDS.toMillis(1));
      System.out.println("waiting ..... "+((ThreadPoolExecutor)pool).getActiveCount());
  }

  Runnable sampleThread = new SampleThread(100);
  pool.submit(sampleThread );
}

**************************************************
** Output:
**************************************************
current number of threads: 0
current number of threads: 1
current number of threads: 1
current number of threads: 1
current number of threads: 1

有没有其他方法可以实现我想要做的事情? 我做了一些研究,没有什么比这更合适了。

先谢谢, 爱德蒙

3 个答案:

答案 0 :(得分:1)

你是来自java.util.concurrent.Executors的newFixedThreadPool - 它仅限于5个线程。你确定它还没有被限制在5个线程而没有任何进一步的审核吗?

答案 1 :(得分:1)

如果不知道SampleThread的作用,很难回答。如果没有花费任何时间,那么线程可能在循环继续之前完成。例如

public static class SampleThread implements Runnable {
    @Override
    public void run() {
    }

}

返回

current number of threads: 0
current number of threads: 0
current number of threads: 0
current number of threads: 0
current number of threads: 0
current number of threads: 0
current number of threads: 0

public static class SampleThread implements Runnable {
    @Override
    public void run() {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            System.out.println(e);
        }
    }
}

返回

current number of threads: 0
current number of threads: 1
current number of threads: 2
current number of threads: 3
current number of threads: 4
current number of threads: 5
waiting ..... 0
current number of threads: 0
current number of threads: 1
current number of threads: 2
current number of threads: 3
current number of threads: 4
current number of threads: 5
waiting ..... 0

您可以使用有关SampleThread的功能的信息编辑帖子吗?

答案 2 :(得分:0)

谢谢大家,示例主管负责向我的客户发送电子邮件通知。

由于发送电子邮件(最多100个)将花费很长时间,我担心线程队列将被重载并且内存资源将耗尽。

是否需要关注?