2012-08-06 22 views
1

是否真的不希望创建10个以上的附加线程? 示例:Java多线程(10或更多?)

for(int i=0; i<100; i++) { 
    new Thread() { 
     public void run() { 
      // something 
     } 
    }.start(); 
} 

将创建并启动100个线程。那不好,对吧?

更新>每个线程正在下载东西,把它放入包

+5

答案所依赖的关键部分是您对“不良”的定义。 – dasblinkenlight 2012-08-06 13:38:34

+0

有时候这是可取的。例如,我在其中一个应用程序中创建了超过50个线程来存档最大的CPU利用率和性能。 – gkuzmin 2012-08-06 13:39:01

+1

这取决于你想要做什么.. – 2012-08-06 13:39:15

回答

6

创建比您需要的更多线程是不可取的。

当然,如果你需要100个线程,那么这是一个很好的数字来创建。

不知道从哪里得到it is undesirable to create more than 10 additional threads。 Java进程可以处理10,000个线程。

+0

我认为java进程可以处理多个10,000线程,我不认为这取决于java进程http://stackoverflow.com/questions/763579/how-many-threads-can-a-java-vm-support – 2012-08-06 14:01:37

+0

我发现即使进程限制为300K,Java进程也会得到大约32K的限制。 10,000的数量是它经常被认为值得尝试减少你拥有的线程数量的地方(或者使用更多的机器) – 2012-08-06 14:03:47

+1

@PeterLawrey哈哈 - 上次我试图看看我会在哪里创建OutOfMemoryException来创建太多的线程,我在Windows 7 +硬重新启动时出现了黑屏;-) – assylias 2012-08-06 20:53:22

1

完全取决于上下文。如果大多数你正在做的工作是cpu绑定,那么除非你实际上有100个内核,否则可能不会造成太大的变化,或者实际上会让事情变得更糟(上下文切换等)。如果I/O任务耗费大量时间,那么线程化可能是有益的。你真的需要做一些基准测试。

2

如果您使用10个线程的线程池并将正确的Runnable传递给它们,它会更容易和更快。

+0

这个问题没有通用的答案。这实际上取决于可运行程序的功能 - 如果他们将大部分时间用于阻塞,只有10个线程的效率会非常低。如果他们继续运行计算,10个线程可能是一个合理的赌注,但即使在这种情况下,答案显然取决于该机器的处理器数量... – assylias 2012-08-06 20:55:01

+0

我完全同意,但我没有添加我的答案的更多细节 – Dimitri 2012-08-07 12:35:29

1

你可能想要的是一个ThreadPool而不是创建这么多的线程。

例如:

ExecutorService executor = Executors.newFixedThreadPool(4); 
executor.submit(YourRunnable); 

看起来更进线程池 - 他们会让你的生活更轻松。

+0

Ahaaha = D谢谢!真! – ruslanys 2012-08-06 15:06:06

+1

@ruslanys对不起,试图帮助;) – Eugene 2012-08-06 15:07:55

+0

真的谢谢你。非常有用的建议。 – ruslanys 2012-08-06 17:14:30