2 回答
TA贡献2016条经验 获得超9个赞
是的,使用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();
}
}
}
TA贡献2003条经验 获得超2个赞
您线程运行的代码需要注入代码以进行状态更改的回调。您可以按照@宏杰李的建议通过更改代码或注入代码来完成此操作,Instrumentation
但是轮询线程可能是最简单的。
注意:线程的状态仅从 JVM 的角度告诉您它是所需的状态。它没有显示给你
是否被阻塞 IO 操作阻塞?
是否进行了上下文切换
是否被操作系统或 BIOS 中断
是否因 GC 或代码替换而停止
它是否在等待对静态初始化程序块的锁定。例如,如果它阻止等待类初始化,则表示它正在运行。
顺便说一句,即使是操作系统也会轮询 CPU 以查看它们在做什么,通常每秒 100 次。
添加回答
举报