我有一個方法會一直被呼叫。
呼叫后會生成一個job(runnable)并提交到執行緒池。每個作業的超時時間不同,取決于傳入的引數。
現在我想監視每個作業是否可以在開始執行時的超時時間內結束。我該怎么辦?
注意timeout是從執行開始到執行結束,而不是從交付到執行緒池的時間到任務執行結束。正因為如此,我覺得future #get (timeout)不能用,對吧。
并且acceptJob不應該阻塞,它必須在提交作業后立即回傳(可能是其他一些邏輯,但不是阻塞)。
ExecutorService pool = Executors.newFixedThreadPool(10);
public void acceptNewJob(Map<String, Object> params) {
// timeout from params
int timeoutInMs = (int) params.get("timeoutInMs");
pool.submit(new Runnable() {
@Override
public void run() {
// generate a job by params
// if this job execute timeout, need alarm
}
});
}
uj5u.com熱心網友回復:
如何包裝每個 runnable 并Timer在超時期限到期時使用 a來檢查 runnable 的狀態。
public void acceptNewJob(Map<String, Object> params) {
// timeout from params
int timeoutInMs = (int) params.get("timeoutInMs");
MonitoredRunnable runnable = new MonitoredRunnable(new Runnable() {
@Override
public void run() {
// generate a job by params
// if this job execute timeout, need alarm
}
}, timeoutInMs);
pool.submit(runnable);
}
// Or use ScheduledThreadPoolExecutor
private Timer timer = new Timer();
public class MonitoredRunnable implements Runnable {
private volatile int state = READY;
public static final int READY = 0;
public static final int RUNNING = 1;
public static final int COMPLETE = 0;
private Runnable task;
private int timeoutInMs;
public MonitoredRunnable(Runnable task, int timeoutInMs) {
this.task = task;
this.timeoutInMs = timeoutInMs;
}
@Override
public void run() {
state = RUNNING;
startMonitor(this);
task.run();
state = COMPLETE;
}
private void startMonitor(MonitoredRunnable runnable) {
timer.schedule(new TimerTask() {
@Override
public void run() {
try {
if (runnable.state != COMPLETE) {
System.out.println("Job timeout.");
// alarm
}
} catch (Exception e) {
//
}
}
}, runnable.timeoutInMs);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/359314.html
