Я использую interrupt () в своем коде для передачи сигнала от потока к другому, чтобы проснуться из «бесконечного» (максимального времени) сна и проверить состояние через некоторое время. Я использую также монитор (синхронизированный блок, уведомлять и ждать) и синхронизированный метод. Я написал свой код так, что некоторые потоки спят до тех пор, пока не получат прерывание, но некоторые из них запускают поток прерывания, когда их не нужно пробуждать (они должны имитировать, что они спят в других вещах). Проблема в том, что я не могу найти поток, который выполняет interrupt (), когда он не должен, как я могу его найти?
Это хороший способ для кодирования с использованием interrupt () таким образом?
Это код, в котором сон прерывается, но не должен
private void medicalVisit(int number) {
long sleepTime = (long) ((Math.random() * 2 + 0.5) * 1000); // 500 <= sleepTime (in msec) <= 2500
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
System.out.println(this.getName()+" ERROR, interrupt from sleep, id: 2 (medicalVisit)");
e.printStackTrace();
}
System.out.println(this.getName()+" - "+number+"° medical visit ended");
}
Это пример кода, который запускает прерывание
private void handlerYellowPatient() {
Iterator<Patient> patientIt = yellows.iterator();
while(patientIt.hasNext()) {
Patient p = patientIt.next();
p.itsTurn = true;
p.interrupt();
yellows.remove(p);
}
}
И это пример кода Правильное "прерывание"
private void waitUntilItsTurn(int number) {
// simulating the period of time before entering in guard
long sleepTime = (long) ((Math.random() * 2 + 0.5) * 1000); // 500 <= sleepTime (in msec) <= 2500
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
// must not be awaken while here
System.out.println(this.getName()+" ERROR MAYBE, interrupt from sleep, id: 1");
e.printStackTrace();
}
WMan.addPatient(this, WMan);
while (!itsTurn) {
try {
Thread.sleep(Long.MAX_VALUE);
} catch (InterruptedException e) {
// WMan handlerRedPatient interrupt#1
System.out.println(this.getName()+" - the wait is over, it's my turn for the "+number+"° times");
}
}
itsTurn = false;
}
Надеемся, что этот код поможет