猿问

当线程改变状态时,有没有办法在进程中获取通知?

当线程改变状态时,有没有办法在进程中获取通知?我正在编写一个监视线程状态变化的程序。我可以经常轮询每个线程,但我更喜欢更具反应性的内容。


函数式编程
浏览 132回答 2
2回答

慕沐林林

是的,使用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();        }    }}

湖上湖

您线程运行的代码需要注入代码以进行状态更改的回调。您可以按照@宏杰李的建议通过更改代码或注入代码来完成此操作,Instrumentation但是轮询线程可能是最简单的。注意:线程的状态仅从 JVM 的角度告诉您它是所需的状态。它没有显示给你是否被阻塞 IO 操作阻塞?是否进行了上下文切换是否被操作系统或 BIOS 中断是否因 GC 或代码替换而停止它是否在等待对静态初始化程序块的锁定。例如,如果它阻止等待类初始化,则表示它正在运行。顺便说一句,即使是操作系统也会轮询 CPU 以查看它们在做什么,通常每秒 100 次。
随时随地看视频慕课网APP

相关分类

Java
我要回答