猿问
回到首页
个人中心
反馈问题
注册登录
下载APP
首页
课程
实战
体系课
手记
专栏
慕课教程
当线程改变状态时,有没有办法在进程中获取通知?
当线程改变状态时,有没有办法在进程中获取通知?我正在编写一个监视线程状态变化的程序。我可以经常轮询每个线程,但我更喜欢更具反应性的内容。
函数式编程
浏览 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(); } }}
0
0
0
湖上湖
您线程运行的代码需要注入代码以进行状态更改的回调。您可以按照@宏杰李的建议通过更改代码或注入代码来完成此操作,Instrumentation但是轮询线程可能是最简单的。注意:线程的状态仅从 JVM 的角度告诉您它是所需的状态。它没有显示给你是否被阻塞 IO 操作阻塞?是否进行了上下文切换是否被操作系统或 BIOS 中断是否因 GC 或代码替换而停止它是否在等待对静态初始化程序块的锁定。例如,如果它阻止等待类初始化,则表示它正在运行。顺便说一句,即使是操作系统也会轮询 CPU 以查看它们在做什么,通常每秒 100 次。
0
0
0
打开App,查看更多内容
随时随地看视频
慕课网APP
相关分类
Java
继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续