0

我遇到了一个问题,希望各位高手能帮忙解决。

我正在设计一个多线程 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

有没有其他方法可以实现我想要做的事情?我做了一些研究,没有什么完全符合要求的。

提前致谢,埃德蒙

4

3 回答 3

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 功能的信息来编辑帖子吗?

于 2013-11-01T19:16:48.050 回答
1

为此,您是 java.util.concurrent.Executors 的 newFixedThreadPool - 它已限制为 5 个线程。您确定它没有任何进一步的节制就已经限制为 5 个线程吗?

于 2013-11-01T18:44:17.273 回答
0

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

由于发送电子邮件(最多 100 封)需要很长时间,我担心线程队列会过载并且内存资源会耗尽。

有什么需要担心的吗?

于 2013-11-02T05:57:14.483 回答