簡體   English   中英

java中的低效線程

[英]inefficient threads in java

我目前有一些問題需要理解為什么在某些情況下,Java中的並行化似乎效率不高。 在下面的代碼中,我構建了4個使用ThreadPool執行的相同任務。

在我的Core i5(2核,4線程)上,如果我將工作器數設置為1,則計算機需要大約5700ms並使用25%的處理器。 如果我將工作器數量設置為4,那么我會觀察100%的CPU使用率,但是...計算時間是相同的:5700ms,而我預計它會低4倍。

為什么? 這是正常的嗎?

(當然我的真正任務更復雜,但這個例子似乎重現了這個問題)。 提前謝謝你的答案。

這是代碼:

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個線程都爭奪一個資源。

使用線程本地Random對象將使您的執行真正並行:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM