У меня есть следующий код, чтобы найти сумму натуральных чисел от 1 до 5000. Это простое упражнение для практики параллелизма.Основная нить случайно не достигает конца (пытаясь суммировать натуральные числа в параллельных потоках)
public static void main(String[] args) throws InterruptedException {
final int[] threadNb = new int[] {5};
final Integer[] result = new Integer[1];
result[0] = 0;
List<Thread> threads = new LinkedList<>();
IntStream.range(0, threadNb[0]).forEach(e -> {
threads.add(new Thread(() -> {
int sum = 0;
int idx = e * 1000 + 1;
while (!Thread.interrupted()) {
if (idx <= (e + 1) * 1000) {
sum += idx++;
} else {
synchronized(result) {
result[0] += sum;
System.err.println("sum found (job " + e + "); sum=" + sum + "; result[0]=" + result[0] + "; idx=" + idx);
Thread.currentThread().interrupt();
}
}
}
synchronized(result) {
System.err.println("Job " + e + " done. threadNb = " + threadNb[0]);
threadNb[0]--;
System.err.println("threadNb = " + threadNb[0]);
}
}));
});
threads.forEach(Thread::start);
//noinspection StatementWithEmptyBody
while(threadNb[0] > 0);
System.out.println("begin result");
System.out.println(result[0]);
System.out.println("end result");
}
Иногда, когда я запускаю код, последние 3 System.out.println()
не отображаются. Если я поставлю заявление в while(threadNb[0] > 0)
, как и еще System.out.println()
, моя проблема никогда не повторится.
Может ли кто-нибудь объяснить мне такое поведение?
Заранее спасибо за любую помощь