2 回答

TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個(gè)贊
是的,使用conditional variable,這是一個(gè)例子:
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貢獻(xiàn)2003條經(jīng)驗(yàn) 獲得超2個(gè)贊
您線程運(yùn)行的代碼需要注入代碼以進(jìn)行狀態(tài)更改的回調(diào)。您可以按照@宏杰李的建議通過更改代碼或注入代碼來完成此操作,Instrumentation
但是輪詢線程可能是最簡(jiǎn)單的。
注意:線程的狀態(tài)僅從 JVM 的角度告訴您它是所需的狀態(tài)。它沒有顯示給你
是否被阻塞 IO 操作阻塞?
是否進(jìn)行了上下文切換
是否被操作系統(tǒng)或 BIOS 中斷
是否因 GC 或代碼替換而停止
它是否在等待對(duì)靜態(tài)初始化程序塊的鎖定。例如,如果它阻止等待類初始化,則表示它正在運(yùn)行。
順便說一句,即使是操作系統(tǒng)也會(huì)輪詢 CPU 以查看它們?cè)谧鍪裁?,通常每?100 次。
添加回答
舉報(bào)