我是创建一个程序,该程序使用陷阱方法计算多个线程的预定积分,结果应为3.1416 ....
,但是我需要添加同步函数才能出现。如果不是,我最终会遇到线程的狂欢?
更新:
因此,在proceso函数中,我正在创建一个线程数组,这些线程会输入类尖端并开始执行操作。问题在于,他们需要以这种方式进入,他们不会中断另一个,并且计算将是预期的。
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 );
}
}
}
简单:
您的线程都写入一个共享字段 sumas 。
猜猜当多个线程在没有任何控件的情况下在共享数据上工作时会发生什么?
因此,您必须确保线程可以独立工作。例如,通过给出每个线程自己的Suma ...当所有线程完成工作时,您都可以在最后添加。
一种简单的方法是提供一种同步方法,例如" addtosuma",您的线程会调用,而不是直接在字段上进行 =。