我正在尝试编写一个线程来监控阻塞操作需要多长时间。例如,我有一个这样的阻塞操作:
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();
无法保证其中一个线程实际上会先于另一个线程开始运行代码,因此我目前无法知道我的超时线程是否真的在正确测量阻塞操作的时间。我认为答案与锁定和等待
有关,但我想不通。
最佳答案
我可以建议您使用类 java.util.concurrent.ThreadPoolExecutor
重写代码.
这个类有很好的方法 awaitTermination()
,我想这正是您需要的。
编辑:
这是你的 BlockingThread,运行 10 秒,Monitor,等待 5 秒:
package sample.threadexecutor;
import java.text.SimpleDateFormat;
import java.util.Date;
public class BlockingThread implements Runnable{
public boolean succsess = false;
@Override
public void run() {
SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss.SSS");
System.out.println(df.format(new Date()) + " start");
try {
Thread.sleep(10000L);
} catch (InterruptedException e) {
System.out.println(df.format(new Date()) + " interrupted");
succsess = false;
return;
}
System.out.println(df.format(new Date()) + " end");
succsess = true;
}
}
和执行器的主要功能:
package sample.threadexecutor;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class main {
public static void main(String[] args) {
SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss.SSS");
ExecutorService service= Executors.newSingleThreadExecutor();
service.submit(new BlockingThread());
try {
service.shutdown();
if(service.awaitTermination(5, TimeUnit.SECONDS)){
System.out.println(df.format(new Date()) + " execution completed");
}else{
System.out.println(df.format(new Date()) + " execution timeout");
}
} catch (InterruptedException e) {
System.out.println(df.format(new Date()) + " monitoring interrupted");
}
}
}
和输出:
22:28:37.005 start
22:28:42.006 execution timeout
22:28:47.006 end
如果我们将超时设置为 20 秒,则输出:
22:30:20.210 start
22:30:30.213 end
22:30:30.214 execution completed
关于java - 监视阻塞操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12207495/