Приведенный ниже код позволяет нам запускать задание
, гарантируя, что только одно задание за раз может запускается с помощью ReentrantLock
.
Есть ли способ изменить этот код для выполнения задания . call ()
асинхронно и чтобы вернуть MyConcurrentJobException
клиенту до запуска потока?
Мы попытались обернуть блок try / catch / finally в новый поток
но разблокировка
и блокировка
должны происходить в одном потоке, поэтому мы получаем исключение 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");
}
}