当前位置: 首页 > 面试题库 >

Java中效率低下的线程

刘狐若
2023-03-14
问题内容

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

在我的Core
i5(2核,4线程)上,如果将工作程序数设置为1,则计算机需要大约5700毫秒,并使用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());
}


 类似资料:
  • 使用thoses和JPA属性 Ehcache对于相同的查询不是有效的, 问题与QueryCache类的函数namedParameters.hashCode()有关,它为同一个查询生成不同的HashCode! 这与类有关 它为同一个数组对象[01,1]生成一个不同的(新的)hachCode! 此hashCode方法对于数组应该是递归的

  • 问题内容: 使用这些JPA属性 Ehcache对于同一查询效率不高, 问题与QueryCache类的namedParameters.hashCode()函数有关,它为同一查询生成了不同的HashCode! 与班级有关 它将为同一Array对象[01,1]生成一个不同的(新)hachCode! 对于数组,此hashCode方法应该是递归的 问题答案: 递归版本完全正常 类org.hibernate.

  • 问题内容: 我突然在我的java-app(使用NetBeans作为IDE)中创建记录器时,突然看到一条警告:“记录器中字符串连接使用效率不高”。 我的原始代码是 但是NetBeans建议将此代码转换为模板(“模板”在这里意味着什么?),并提供以下代码: 这两种串联方式有什么不同,尽管我从未使用过后者。 干杯。 问题答案: 我会忽略该警告(如果可能,请将其关闭)。串联的效率不是那么低,因为现代编译器

  • 今天我决定测试一下,结果我惊讶地发现(至少在C#正则表达式引擎中)似乎比其他两个没有太大区别的代码效率要低。下面是我测试输出的10000个由1000个随机字符组成的字符串,其中5077个实际包含一个数字: 这对我来说是一个惊喜,有两个原因,如果有人能给我一些启示,我会很感兴趣: 我本以为范围的实现会比集合的实现效率高得多。 我不能理解为什么比差。除了的简写之外,还有其他内容吗? 下面是测试代码:

  • 问题内容: 我需要使用Java程序减小图像的大小(而不是宽度和高度)。他们为此提供了任何好的API吗? 我需要将大小从1MB减少到大约50kb-100 kb。当然,分辨率会降低,但这并不重要。 问题答案: 这是工作代码 这段代码对我来说很棒。如果需要调整图像大小,则可以在此处更改x和y比例J;

  • XAML: .cs: