Java - асинхронное выполнение заданий с использованием ReentrantLock?

Приведенный ниже код позволяет нам запускать задание , гарантируя, что только одно задание за раз может запускается с помощью 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");
    }
}
6
задан Marcus Leon 21 February 2011 в 17:28
поделиться