我们举一个使用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()没有足够的精度?
使用System.nanoTime()解决了该问题。