Моя неопытность с параллелизмом совершенно ясна, и я ищу здесь некоторую помощь.
Я писал многопоточное приложение на Java, пока меня одолевали сомнения. Пожалуйста, посмотрите на этот пример кода (смешивание псевдокода и Java):
Тело 1 тела (порция) :
/* It creates and starts thread Thread 2 */
if (!thread2.taskCompleted)
thread2.wait();
/* continue execution... */
Тело 2 тела :
class Thread2 extends Thread {
volatile boolean taskCompleted = false;
public void run() {
/* It executes a complex task... */
taskCompleted = true;
notifyAll(); // notify waiting threads
}
}
Моя проблема проста: что произойдет, если операторы будут выполнены в таком порядке:
- Тема 1 запускается Тема 2
- Нить 2 делает что-то, но не выполняет задачу
- Тема 1 читает задание завершено как ложное
- Поток 2 завершает задачу, поднимает флаг taskCompleted и уведомляет (никого)
- Тема 1 начинает ждать. И никогда не кончается.
Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи и / или это хорошо известный сценарий (точный дубликат?)