Java中效率低下的线程

Java中效率低下的线程

本文介绍了Java中效率低下的线程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前有一些问题需要理解,为什么在某些情况下Java中的并行化似乎效率低下.在以下代码中,我构建了4个使用ThreadPool执行的相同任务.

I currently have some problems to understand why in some cases, parallelization in Java seems infficient. In the following code, I build 4 identical tasks that are executed using a ThreadPool.

在我的Core i5(2核,4线程)上,如果将工作程序数设置为1,则计算机大约需要5700毫秒,并使用25%的处理器.如果将工作程序数设置为4,则可以观察到100%的CPU使用率,但是...计算时间是相同的:5700ms,而我希望它可以减少4倍.

On my Core i5 (2 core, 4 thread), if I set the number of workers to 1, the computer needs around 5700ms and use 25% of the processor.If I set the number of workers to 4, then I observe 100% of CPU usage but... the time of computation is the same: 5700ms, while I expect it to be 4 times lower.

为什么?正常吗?

(当然,我的实际任务更加复杂,但是该示例似乎可以重现该问题).预先感谢您的回答.

(Of course my real task is more complicated, but the example seems to reproduce the problem). Thank you by advance for your answers.

这是代码:

public class Test {

public static void main(String[] args) {
    int nb_workers=1;
    ExecutorService executor=Executors.newFixedThreadPool(nb_workers);
    long tic=System.currentTimeMillis();
    for(int i=0; i<4;i++){
        WorkerTest wt=new WorkerTest();
        executor.execute(wt);
    }
    executor.shutdown();
    try {
        executor.awaitTermination(1000, TimeUnit.SECONDS);
    } catch (InterruptedException e) {e.printStackTrace();}
    System.out.println(System.currentTimeMillis()-tic);
}

public static class WorkerTest implements Runnable {
    @Override
    public void run()  {
        double[] array=new double[10000000];
        for (int i=0;i<array.length;i++){
            array[i]=Math.tanh(Math.random());
        }
    }
}
}

推荐答案

提示是您正在调用Math.random,它使用Random的单个全局实例.因此,您的所有4个线程都在争用一种资源.

The clue is that you are calling Math.random which uses a single global instance of Random. So, all your 4 threads compete for the one resource.

使用线程本地Random对象将使您的执行真正并行:

Using a thread local Random object will make your execution really parallel:

Random random = new Random();
double[] array = new double[10000000];
for (int i = 0; i < array.length; i++) {
    array[i] = Math.tanh(random.nextDouble());
}

这篇关于Java中效率低下的线程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-22 17:27