wait & notify - печать разных идентификаторов потоков - PullRequest
0 голосов
/ 16 июня 2020

Извините, если это основной 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========

1 Ответ

0 голосов
/ 16 июня 2020

если вы видите свой код в основном классе ThreadWait wait = ThreadWait.getInstance();, вы создаете экземпляр и передаете его потоку ожидания. Который использует шаблон singleton для создания экземпляра. Но для уведомления вы используете CompletableFuture, который создает отдельный поток

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...