Я пытаюсь научиться использовать wait и уведомлять.Ожидание и уведомление как синхронизация контроллера-менеджера
Мне нужно приложение, которое каждые 10 секунд запрашивает у пользователя, если поток должен продолжать работать или нет. Если нет (пользователь нажимает n), потоку приходится ждать, пока пользователь не напишет «y» на консоли.
Я должен использовать wait и уведомлять, но я не знаю, как это сделать.
Я пытаюсь реализовать ожидание и уведомление без подсказки от пользователя.
Это основной класс, который создает два потока, FolderThread - это поток, который должен работать, и ControlThread - тот, кто должен попросить пользователя, хочет ли он продолжить или нет.
public class MainClass {
public static void main(String[] args) throws InterruptedException {
FolderThread folder = new FolderThread();
Thread t = new Thread(folder);
ControlThread control = new ControlThread(folder);
Thread t2 = new Thread(control);
t.start();
t2.start();
}
}
FolderThread
public class FolderThread implements Runnable {
@Override
public void run() {
while(true) {
System.out.println("started");
synchronized(this) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
ControlThread
public class ControlThread implements Runnable {
FolderThread folder;
public ControlThread (FolderThread folder) {
this.folder = folder;
}
@Override
public void run() {
synchronized(folder) {
folder.notify();
}
}
}
Проблема заключается в том, что она печатает "Started", а затем он ожидает уведомления о том, никогда не придет! Зачем?
Что происходит если ваш 'ControlThread' идет первым? –
@SotiriosDelimanolis ничего не изменил – untruste
Это не то, что я имею в виду. Выполнение резьбы не является детерминированным. Если, по крайней мере, поток для 'ControlThread' идет первым и выполняет' уведомление ', прежде чем другой поток имеет шанс «подождать», что вы ожидаете? Или даже то, что произойдет, если 'notify' появится после' wait', поток будет возвращаться к 'wait' на следующей итерации. –