Java 并发时间性能:Executors、ThreadGroup 还是 Runnable?

Fil*_*lve 0 java performance multithreading

我开始为 Java 中已经存在的项目(非多线程项目)开发一些多线程平台,我需要性能增益,减少整个项目中复杂计算的时间。

我一直在使用 Executors,但我真的不知道与 ThreadGroup 或纯 Runnable 相比,它是否是提高性能的最佳解决方案。

那么,应该使用哪一种呢?

Tud*_*dor 5

如果您将线程池重用于多个计算(即,您启动一​​个具有 10 个线程的池并执行 100 次任务 100 次,而不是每次启动 10 个线程 100 次),您只会从线程池中获得性能提升。他们仍然需要初始开销来启动,你无法逃避这部分。所以这是一个例子:

ExecutorService exec = Executors.newFixedThreadPool(10);

for(int i = 0; i < 10; i++) {
    exec.submit(new Task(i));
}    

// later

for(int i = 0; i < 10; i++) {
    exec.submit(new Task(i));
}    

exec.shutdown(); // etc.
Run Code Online (Sandbox Code Playgroud)

在这种情况下,一开始我只支付启动 10 个线程一次的开销。

使用纯线程:

List<Thread> threads = new ArrayList<Thread>();
for(int i = 0; i < 10; i++) {
    Thread t = new Thread(new Task(i));
    threads.add(t);       
    t.start();   
}  

for(Thread t: threads) {
    t.join();
}

// later I need more work

threads = new ArrayList<Thread>();
for(int i = 0; i < 10; i++) {
    Thread t = new Thread(new Task(i));
    threads.add(t);        
    t.start();  
}  

for(Thread t: threads) {
    t.join();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我支付了两次启动 10 个线程的开销,这是对线程的错误使用。当然,如果你只需要执行一次这些任务,不会有任何性能差异,只是与执行器一起工作更容易。

我不明白你所说的纯Runnable(可能是纯线程?)的意思,因为线程池(执行器)也适用于Runnables。