Извините, если это основной c вопрос. Я новичок в темах. Я пытаюсь понять wait () и notify () поток. Проблема в том, что идентификаторы потоков печатаются по-разному, когда я жду и уведомляю в одном классе. Да, уведомление происходит правильно, но мне интересно, почему идентификаторы потоков уведомлений продолжают меняться? Пожалуйста, пролейте свет, подождите, и уведомление должно происходить для одного и того же потока, не так ли?
Ожидание потока:
import java.util.concurrent.CompletableFuture;
public class ThreadWait implements Runnable {
private static ThreadWait threadWait;
private ThreadNotify threadNotify = ThreadNotify.getInstance();
private ThreadWait() {
}
public static ThreadWait getInstance() {
if (threadWait == null) {
threadWait = new ThreadWait();
}
return threadWait;
}
@Override
public void run() {
synchronized (this) {
try {
for (int i = 0; i < 5; i++) {
Thread.sleep(2000);
CompletableFuture.runAsync(() -> {
// method call in async.
threadNotify.notifyThread();
});
System.out.println(Thread.currentThread().getId() + "=======ThreadWait : wait========");
wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void notifyThread() {
synchronized (this) {
System.out.println(Thread.currentThread().getId() + "=======ThreadWait : Notified========");
notify();
}
}
}
Уведомление потока
public class ThreadNotify {
private static ThreadNotify threadNotify;
private ThreadWait threadWait;
private ThreadNotify(){}
public static ThreadNotify getInstance(){
if(threadNotify == null){
threadNotify = new ThreadNotify();
}
return threadNotify;
}
public void notifyThread(){
threadWait = ThreadWait.getInstance();
fibonacci(44);
//threadWait.notify()
threadWait.notifyThread(); // want to print threadIDs, so created this method.
}
private int fibonacci(int n) {
if (n <= 1)
return n;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
Main Резьба:
public class MainThread {
public static void main(String[] args) {
ThreadWait wait = ThreadWait.getInstance();
Thread th = new Thread(wait);
th.start();
}
}
вывод:
12=======ThreadWait : wait========
14=======ThreadWait : Notified========
12=======ThreadWait : wait========
15=======ThreadWait : Notified========
12=======ThreadWait : wait========
16=======ThreadWait : Notified========
12=======ThreadWait : wait========
17=======ThreadWait : Notified========
12=======ThreadWait : wait========
18=======ThreadWait : Notified========