我有一个在多个不同环境中运行的多线程应用程序,我认为有时环境会限制可以同时运行的线程总数。特别是,我认为其中一个系统只允许单个线程运行,因此多线程没有任何好处。什么是一种简单的方法来判断这种情况何时发生?
ExecutorService exec = Executors.newFixedThreadPool(4);
TestRunnable tr = new TestRunnable();
for ( int i = 0; i < 20; i++ ) {
try {
exec.execute(sr);
} catch (Exception E) {
}
}
答案 0 :(得分:1)
我有一个在多个不同环境中运行的多线程应用程序,我认为有时环境会限制可以同时运行的线程总数。
是的,环境确实限制了同时实际运行的线程数。具体做法是:
各种操作系统限制可能会阻止您使用所有可用资源;例如基于ulimit和cgroup的限制。
如果系统繁忙,您的JVM可能会与其他应用程序进程竞争。
Java代码中可能存在并发瓶颈;例如一个线程锁定某些数据结构经常占用其他线程的点。
但是,JVM本身并不会人为地限制你。
您可以使用Runtime.availableProcessors
方法找出可用处理器的名义数量。
注意:“runnable”线程的数量与“running”线程的数量不同;即可以同时物理执行指令的线程数。 “可运行”线程的数量是可以计划执行的线程数...如果有足够的处理器可用。