java - 监控提交到线程池的任务是否超时
问题描述
我有一个会一直被调用的方法。
调用后会生成一个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
}
});
}
解决方案
如何包装每个可运行文件并Timer
在超时期限到期时使用 a 检查可运行文件的状态。
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);
}
推荐阅读
- client - 如果手机应用程序关闭,Telegram API 不会发送更新?
- python - 如果在将 csv 行与文件中的单词匹配时多次命中语句
- git - github-linguist 包括语言统计中具有 linguist-vendred 属性的文件
- javascript - 为什么 clearInterval 只在第一次工作?
- python - 3sum算法。我没有得到小于目标的数字的结果
- python - 将元组中的元素更改为 Python 中的列表
- haskell - 负数不被视为 Int 吗?
- r - 如何使用绘图功能从矩阵中绘制多列
- java - Hibernate vladmihalcea jsonb 类型:是否可以将默认 JSON 字段的顺序更改为不同的顺序?
- java - 使用当前位置时,我不断获取位置空值