2017-06-07 21 views
1

我有一個API只支持異步做一些操作,我想強制它阻止我的線程。強制異步操作​​阻塞當前線程

static void doWorkSync(Worker worker) { 
    final Condition condition = new ReentrantLock().newCondition(); 
    worker.doWorkAsync(() -> condition.signal()); 
    try { 
    condition.await(); 
    } catch (InterruptedException e) { 
    throw new AssertionError(e); 
    } 
} 

正如上面所使用的,條件是這種情況最激烈的解決方案嗎?

+0

「doWorkAsync」API的外觀如何?有''Runnable'回調參數之類的'void'? –

+0

另外,如果沒有相應的「Lock」,就不能'發信號'或'等待'。 –

+0

@SotiriosDelimanolis是的:'void doWorkAsync(Runnable action)' –

回答

0

CountDownLatch是你在找什麼!

static void doWorkSync(Worker worker) { 
    final CountDownLatch latch = new CountDownLatch(1); 
    worker.doWorkAsync(() -> latch.countDown()); 
    try { 
    latch.await(); 
    } catch (InterruptedException e) { 
    throw new AssertionError(e); 
    } 
}