我遇到了一个问题,我希望大师可以帮忙。
我正在设计一个多线程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
有没有其他方法可以实现我想要做的事情? 我做了一些研究,没有什么比这更合适了。
先谢谢, 爱德蒙
答案 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个)将花费很长时间,我担心线程队列将被重载并且内存资源将耗尽。
是否需要关注?