ForkJoin示例中的精确故障

问题描述 投票:0回答:1

我们举一个使用ForkJoin类示例的例子,练习是将一个Strings数组拆分成两个forks,然后显示每个fork计算出的数组的字符串。

在我们制作第一个简单示例时,我们只提供了每个数组的一半:

  invokeAll(
                    new Tarea(data,0, data.length/2-1, true),
                    new Tarea(data,data.length/2, data.length, true)
            );

每个fork使用以下简单方法:

  private void extract(int[]data){

    long begin = System.currentTimeMillis();
        for(int i=start;i<end;i++){
            System.out.println(Thread.currentThread().getName()+" \t Value "+i+":\t "+data[i]);   
    long end = System.currentTimeMillis() - begin;

     System.out.println("Elapsed time: "+end);

} }

该程序运行完美,每个fork都可以完成它的工作。但是经过的时间有一个问题:通常它在两个叉子上是相同的,有时它是不同的,有时,其中一个叉子的经过时间为0.这个叉子总是先死掉的。

将方法设置为synchronized并使用double时也会发生这种情况。

没有用辅助类测试来保持同步范围内的数字,但我怀疑是为什么会发生这种情况。

我们为什么会遇到这些异常现象?

我们遇到麻烦的PC使用Windows 8.1,是一台现代PC并使用jdk 1.7。

编辑:对于大数组,它不显示0,但无论如何计算几百个元素时,我强烈怀疑它需要不到一毫秒。也许currentTimeMillis()没有足够的精度?

java timestamp precision numeric fork-join
1个回答
0
投票

使用System.nanoTime()解决了该问题。

© www.soinside.com 2019 - 2024. All rights reserved.