我正在创建一个程序,使用陷阱方法计算多个线程的预定积分,结果应该是3.1416 .......
但是我需要为它添加一个同步函数。如果不是,我最终会得到一堆线程?
更新
所以在proceso函数中,我正在创建一个进入类Acumular并开始执行操作的线程数组。问题是他们需要以这种方式进入,他们不会打断另一个,计算将是预期的。
import static java.lang.Math.sqrt;
/**
*
* @author GV
*/
public class Examen2 {
public double sumas = 0.0;
public static void main(String[] args) {
try {
Examen2 obj = new Examen2();
obj.proceso();
}catch(Exception ex){
}
}
public void proceso () {
double x = 0.0;
Acumular thr[];
thr = new Acumular[4];
try {
for( int i = 0; i < 4; i++) {
thr[i] = new Acumular(x, x+=.25, .00001);
}
for( int i = 0; i < 4; i++) {
thr[i].start();
}
for( int i = 0; i < 4; i++) {
thr[i].join();
}
} catch (InterruptedException ex) {
}
double resultado = sumas*4;
System.out.println(resultado);
}
class Acumular extends Thread {
private final double x1, x2, paso;
public Acumular (double a, double b, double p) {
paso = p;
x1 = a;
x2 = b;
}
@Override
public void run() {
for (double i = x1; i < x2; i += paso){
sumas +=(f(i) + f(i)) * (paso / 2);
}
}
public double f(double x) {
return sqrt( 1.0 - x*x );
}
}
}
答案 0 :(得分:1)
简单:
您的帖子都在写一个共享字段 sumas 。
猜猜当多个线程在没有任何控制的情况下处理共享数据时会发生什么?!
因此,您必须确保您的线程可以独立工作。例如,通过给每个线程自己的suma ...当所有线程完成他们的工作时,你可以在最后添加。
一种简单的方法是提供一个像“addToSuma”这样的同步方法,你的线程会调用它而不是直接在字段上做+ =。