1 回答

TA貢獻1831條經驗 獲得超4個贊
您可以使用條件變量來完成此操作。
final ReentrantLock lock = new ReentrantLock();
final Condition condition = lock.newCondition();
private void waitForInput() {
? ? lock.lock();
? ? Listener.msgEvnt = null;
? ? try {
? ? ? ? while (Listener.msgEvnt == null)
? ? ? ? ? ? condition.await();
? ? } catch (InterruptedException e) {
? ? ? ? e.printStackTrace();
? ? } finally {
? ? ? ? lock.unlock();
? ? }
}
@Override
public void onMessageReceived(MessageReceivedEvent event) {
? ? lock.lock();
? ? try {
? ? ? ? Listener.msgEvnt = msgEvnt;
? ? ? ? condition.signal();
? ? } finally {
? ? ? ? lock.unlock();
? ? }
}
請參閱可重入鎖和條件
您可以使用阻塞隊列
final BlockingQueue queue = new ConcurrentBlockingQueue();
private MessageReceivedEvent waitForInput() throws InterruptedException {
? ? return queue.take();
}
@Override
public void onMessageReceived(MessageReceivedEvent event) {
? ? queue.put(event);
}
您可以使用Callback,這是我推薦的。
Consumer<? super MessageReceivedEvent> callback;
private void onInput(Consumer<? super MessageReceivedEvent> callback) {
? ? this.callback = callback;
}
@Override
public void onMessageReceived(MessageReceivedEvent event) {
? ? if (this.callback != null)
? ? ? ? this.callback.accept(event);
? ? this.callback = null;
}
使用示例:
listener.waitForInput(event -> {
? ? System.out.printf("%#s: %s\n", event.getAuthor(), event.getMessage().getContentDisplay());
});
添加回答
舉報