亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

僅當主監聽器更新時,如何將主事件監聽器中的 MesageReceivedEvent

僅當主監聽器更新時,如何將主事件監聽器中的 MesageReceivedEvent

小怪獸愛吃肉 2023-08-16 10:07:14
我需要創建一個新線程,當且僅當主 ListenerAdapter 內更新 MessageReceivedEvent 時才會執行一個方法,并在變量未更新時讓線程休眠。該線程應獨立于主線程運行,并且不會停止新請求。這是線程類,private static final class Worker extends Thread {        private volatile boolean running = false;MessageReceivedEvent event; //this must update along with the listener        private boolean validateData() {            if (//something) {                return true;            }            return false;        }        private void waitForInput() {            boolean hasInput = false;            try {                while (!hasInput) {                    hasInput = validateData();                    if (!hasInput) {                        Thread.sleep(10);                    }                }            } catch (InterruptedException iex) {                Thread.currentThread().interrupt();            }        }        @Override        public void run() {            running = true;            while (running) {                waitForInput();                //do something            }        }    }它是一個由主線程請求運行的內部類,只有當來自偵聽器的實際事件發生變化時,才必須更新其中的 MessageReceivedEvent,否則它不應該執行任何操作。測試時,只會根據觸發該線程的MessageEvent執行,如何讓該線程接收到更新?public class Listener extends ListenerAdapter {    public static MessageReceivedEvent msgEvnt;    @Override    public void onMessageReceived(MessageReceivedEvent msgEvnt) {                    Listener.msgEvnt = msgEvnt;    }這就是偵聽器所做的全部工作,每當有新的 messageEvent 時就更新變量。
查看完整描述

1 回答

?
慕容708150

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());

});


查看完整回答
反對 回復 2023-08-16
  • 1 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號