Java n 个线程更新值
Java n threads updates value
我正在尝试同时 运行 n 个线程。每个线程都应该对不同的数组求和并更新全局值。
很遗憾,全局值更新不正确。
我不想使用 thread.join()。
到目前为止,这是我的代码:
public class myClass {
private static class Values {
private static double sum;
public synchronized static void add(double dd) {
sum += dd;
};
public synchronized double get() {
return sum;
}
}
public static double CreateThreads(double[] array) {
final Values values = new Values();
...
...
...
Thread[] threads = new Thread[nOP];
for (int i = 0; i<threads.length; i++) {
threads[i] = new Thread(new Runnable() {
public void run() {
Values.add(sum(tab));
}
});
threads[i].start();
}
return values.get();
}
public static void main(String[] args) throws IOException {
double[] arr = createArray(4);
double sumLogg = CreateThreads(arr);
System.out.println("\n\nSum: " + sumLogg);
}
有什么想法吗?
在您的代码中,您使用 threads[i].start();
启动线程,但您永远不会等待它们通过 .join()
调用完成执行。这可能会导致您的方法 return 一个值 在 所有线程都完成执行之前,导致它 return 一个不正确的值。
要解决此问题,请在 return 值之前添加类似的内容:
for(Thread t : threads) {
t.join();
}
如果您不想使用 Thread.join,您可以使用 CountDountLatch:
CountDownLatch cdl = new CountDownLatch(nOP);
Thread[] threads = new Thread[nOP];
for (int i = 0; i<threads.length; i++) {
threads[i] = new Thread(new Runnable() {
public void run() {
values.add(sum(tab));
cdl.countDown();
}
});
threads[i].start();
}
cdl.await();
在这种情况下你不需要使用额外的同步,CountDownLatch 是一个 synchronzier(参见 java.util.concurrent 包描述)并且根据它的 javadoc "Until the count reaches zero, actions in a thread prior to calling countDown() happen-before actions following a successful return from a corresponding await() in another thread."
我正在尝试同时 运行 n 个线程。每个线程都应该对不同的数组求和并更新全局值。
很遗憾,全局值更新不正确。
我不想使用 thread.join()。
到目前为止,这是我的代码:
public class myClass {
private static class Values {
private static double sum;
public synchronized static void add(double dd) {
sum += dd;
};
public synchronized double get() {
return sum;
}
}
public static double CreateThreads(double[] array) {
final Values values = new Values();
...
...
...
Thread[] threads = new Thread[nOP];
for (int i = 0; i<threads.length; i++) {
threads[i] = new Thread(new Runnable() {
public void run() {
Values.add(sum(tab));
}
});
threads[i].start();
}
return values.get();
}
public static void main(String[] args) throws IOException {
double[] arr = createArray(4);
double sumLogg = CreateThreads(arr);
System.out.println("\n\nSum: " + sumLogg);
}
有什么想法吗?
在您的代码中,您使用 threads[i].start();
启动线程,但您永远不会等待它们通过 .join()
调用完成执行。这可能会导致您的方法 return 一个值 在 所有线程都完成执行之前,导致它 return 一个不正确的值。
要解决此问题,请在 return 值之前添加类似的内容:
for(Thread t : threads) {
t.join();
}
如果您不想使用 Thread.join,您可以使用 CountDountLatch:
CountDownLatch cdl = new CountDownLatch(nOP);
Thread[] threads = new Thread[nOP];
for (int i = 0; i<threads.length; i++) {
threads[i] = new Thread(new Runnable() {
public void run() {
values.add(sum(tab));
cdl.countDown();
}
});
threads[i].start();
}
cdl.await();
在这种情况下你不需要使用额外的同步,CountDownLatch 是一个 synchronzier(参见 java.util.concurrent 包描述)并且根据它的 javadoc "Until the count reaches zero, actions in a thread prior to calling countDown() happen-before actions following a successful return from a corresponding await() in another thread."