我正在尝试编写一个线程来监视阻塞操作需要多长时间。例如,我有这样的阻止操作:
class BlockingThread extends Thread{
public volatile boolean success = false;
public volatile long startedTime = 0;
public void run(){
startedTime = System.currentTimeMillis();
success = doBlockingAction(); //no idea how long this action will take
}
}
如果阻塞操作花费太长时间,我想要另一个线程基本上会调用“超时”函数:
class MonitorThread extends Thread{
public void run(){
while(System.currentTimeMillis() - blockingThread.startedTime > TIMEOUT_DURATION)
{
..keep waiting until the time runs out..
}
if(!blockingThread.success){
listener.timeout();
//Took too long.
}
}
}
当我在 MonitorThread 中测量时间时,我无法理解如何确保 BlockingThread 当前实际上处于阻塞操作中。
如果我做这样的事情,
Thread blockingThread = new BlockingThread();
blockingThread.start();
Thread monitorThread = new MonitorThread();
monitorThread.start();
不能保证其中一个线程实际上在另一个线程之前开始运行代码,因此我目前无法知道我的超时线程是否实际上正确地测量了阻塞操作的时间。我认为答案与锁定和wait
ing 有关,但我无法弄清楚。