【发布时间】:2026-02-04 06:35:01
【问题描述】:
下面的代码允许我们运行job,同时确保使用ReentrantLock一次只能运行一个作业。
有没有办法修改这段代码以异步运行job.call(),并在启动线程之前将MyConcurrentJobException返回给客户端?
我们尝试将 try/catch/finally 块包装在一个新的 Thread 中,但 unlock 和 lock 必须在同一个线程中发生,所以我们得到一个 IllegalMonitorException
??
final static Lock lock = new ReentrantLock();
public Object runJob(String desc, Callable job, boolean wait) {
logger.info("Acquiring lock");
if (!lock.tryLock()) {
throw new MyConcurrentJobException();
}
activeJob = new JobStatus(desc);
logger.info("Lock acquired");
try {
return job.call();
} catch (MarginServiceAssertionException e) {
throw e;
} catch (MarginServiceSystemException e) {
throw e;
} catch (Exception e) {
throw new MarginServiceSystemException(e);
} finally {
activeJob = null;
logger.info("Releasing lock");
lock.unlock();
logger.info("Lock released");
}
}
【问题讨论】:
标签: java asynchronous reentrantlock