Mar*_*eon 6 java asynchronous reentrantlock
下面的代码允许我们运行一段job时间,确保一次只能运行一个作业ReentrantLock.
有没有办法修改此代码以job.call()异步运行并MyConcurrentJobException在启动线程之前返回到客户端?
我们试图包裹的try/catch /终于在一个新的块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");
}
}
Run Code Online (Sandbox Code Playgroud)
你可以使用Semaphore而不是ReentrantLock,它的许可不受线程约束.
像这样的东西(不确定你想job.call()在异步情况下做什么):
final static Semaphore lock = new Semaphore(1);
public void runJob(String desc, Callable job, boolean wait) {
logger.info("Acquiring lock");
if (!lock.tryAcquire()) {
throw new MyConcurrentJobException();
}
startThread(new Runnable() {
public void run() {
try {
job.call();
} finally {
lock.release();
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2711 次 |
| 最近记录: |