Java可调用:多于单个线程进程所花费的时间



我有以下示例代码。

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.concurrent.*;
public class CalculationThread implements Callable<Long> {
    public Long call() throws Exception {
        long k=0L;
        for(int i=0;i<100000;i++){
            for(int j=0;j<50;j++){
                k=i+j;
            }
        }
        return k;
    }
    public static void main(String[] args) throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(4);
        long startTime = System.nanoTime();
        for(int lo=0;lo<5000;lo++){
            Future<Long> result = executorService.submit(new CalculationThread());
            try {
                Long l = result.get();
            } catch (Exception e) {
                result.cancel(true);
            }
        }
        long endTime = System.nanoTime();
        System.out.println("Using threads took "+(endTime - startTime) + " ns");
        executorService.shutdown();
        executorService.awaitTermination(1, TimeUnit.SECONDS);
        long k=0L;
        startTime = System.nanoTime();
        for(int lo=0;lo<5000;lo++){
            for(int i=0;i<100000;i++){
                for(int j=0;j<50;j++){
                    k=i+j;
                }
            }
        }
        endTime = System.nanoTime();
        System.out.println("Generally it takes "+(endTime - startTime) + " ns");
    }
}

输出与

一样分散
Using threads took 101960490 ns
Generally it takes 143107865 ns

Using threads took 245339720 ns
Generally it takes 149699885 ns

可以注意到,第二行几乎是不变的,而线程版本变化很大。为什么会出现这种情况呢?可以做些什么来减少可变性?请让我知道,如果我做了一些愚蠢的事情,因为我是新的Java多线程。

Future#get阻塞,直到你的可调用对象完成。因此,主线程向池提交一个Callable,然后在提交下一个之前等待它完成。您有创建池的四个线程的开销,然后在创建可调用对象的线程和对象创建之间进行上下文切换(在可调用对象被丢弃时进行垃圾收集),然后您没有并发地执行任何工作。

你怎么能得到使用池的版本更快的数字是令人费解的。当我在本地运行这个时(并且很好地制作了MVCE,顺便说一句,我可以在没有更改的情况下复制粘贴并且它有效),我得到的线程池部分的数字始终更高,它大约需要单线程代码的3倍。

相关内容

  • 没有找到相关文章

最新更新