Java - 使用ReentrantLock运行作业异步?

Mar*_*eon 6 java asynchronous reentrantlock

下面的代码允许我们运行一段job时间,确保一次只能运行一个作业ReentrantLock.

有没有办法修改此代码以job.call()异步运行并MyConcurrentJobException在启动线程之前返回到客户端?

我们试图包裹的try/catch /终于在一个新的块Thread,但unlocklock在同一线程的情况发生,所以我们得到一个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)

axt*_*avt 5

你可以使用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)