第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

僅當(dāng)主監(jiān)聽器更新時(shí),如何將主事件監(jiān)聽器中的 MesageReceivedEvent

僅當(dāng)主監(jiān)聽器更新時(shí),如何將主事件監(jiān)聽器中的 MesageReceivedEvent

小怪獸愛吃肉 2023-08-16 10:07:14
我需要?jiǎng)?chuàng)建一個(gè)新線程,當(dāng)且僅當(dāng)主 ListenerAdapter 內(nèi)更新 MessageReceivedEvent 時(shí)才會(huì)執(zhí)行一個(gè)方法,并在變量未更新時(shí)讓線程休眠。該線程應(yīng)獨(dú)立于主線程運(yùn)行,并且不會(huì)停止新請(qǐng)求。這是線程類,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            }        }    }它是一個(gè)由主線程請(qǐng)求運(yùn)行的內(nèi)部類,只有當(dāng)來自偵聽器的實(shí)際事件發(fā)生變化時(shí),才必須更新其中的 MessageReceivedEvent,否則它不應(yīng)該執(zhí)行任何操作。測(cè)試時(shí),只會(huì)根據(jù)觸發(fā)該線程的MessageEvent執(zhí)行,如何讓該線程接收到更新?public class Listener extends ListenerAdapter {    public static MessageReceivedEvent msgEvnt;    @Override    public void onMessageReceived(MessageReceivedEvent msgEvnt) {                    Listener.msgEvnt = msgEvnt;    }這就是偵聽器所做的全部工作,每當(dāng)有新的 messageEvent 時(shí)就更新變量。
查看完整描述

1 回答

?
慕容708150

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊

您可以使用條件變量來完成此操作。

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

? ? }

}

請(qǐng)參閱可重入鎖和條件


您可以使用阻塞隊(duì)列

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

});


查看完整回答
反對(duì) 回復(fù) 2023-08-16
  • 1 回答
  • 0 關(guān)注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)