Есть ли способ получать уведомления в процессе, когда поток изменяет состояние? - PullRequest
0 голосов
/ 05 ноября 2018

Есть ли способ получать уведомления в процессе, когда поток изменяет состояние? Я пишу программу, которая отслеживает изменения состояния потока. Я могу часто опрашивать каждую тему, но я бы предпочел что-то более реактивное.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Код, который вы выполняете в потоке, должен быть вставлен с кодом, чтобы сделать обратный вызов, состояние которого изменяется. Вы можете сделать это, изменив код, как предлагает @ 宏杰 李, или введя код с помощью Instrumentation, однако опрос потоков, вероятно, будет самым простым.

ПРИМЕЧАНИЕ. Состояние потока говорит только о желаемом состоянии с точки зрения JVM. Это не показывает вам

  • заблокирован ли он при операции ввода-вывода?
  • было ли это переключено в контекст
  • было ли оно прервано ОС или BIOS
  • остановлен ли он для ГХ или замены кода
  • ожидает ли он блокировки статического блока инициализации. например если он заблокировал ожидание инициализации класса, он говорит, что это RUNNING.

Кстати, даже ОС опрашивает процессоры, чтобы увидеть, что они делают, обычно 100 раз в секунду.

0 голосов
/ 05 ноября 2018

да, используйте conditional variable, вот пример:

import java.util.concurrent.locks.*;
public class CubbyHole2 {
    private int contents;
    private boolean available = false;  // this is your state
    private Lock aLock = new ReentrantLock(); // state must be protected by lock
    private Condition condVar = aLock.newCondition(); // instead of polling, block on a condition

    public int get(int who) {
        aLock.lock();  
        try {
            // first check state
            while (available == false) {
                try {
                    // if state not match, go to sleep
                    condVar.await(); 
                } catch (InterruptedException e) { }
            }
            // when status match, do someting

            // change status
            available = false;
            System.out.println("Consumer " + who + " got: " +
                                contents);
            // wake up all sleeper than wait on this condition
            condVar.signalAll();  
        } finally {
            aLock.unlock();
            return contents;
        }
    }

    public void put(int who, int value) {
                    aLock.lock();
    try {
        while (available == true) {
            try {
                condVar.await();
            } catch (InterruptedException e) { }
        }
        contents = value;
        available = true;
        System.out.println("Producer " + who + " put: " +
                            contents);
        condVar.signalAll();
        } finally {
            aLock.unlock();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...