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

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

如何向 Android 線程發(fā)出信號(hào)以執(zhí)行方法?

如何向 Android 線程發(fā)出信號(hào)以執(zhí)行方法?

慕碼人8056858 2022-06-30 11:51:32
我想產(chǎn)生一個(gè)休眠的線程,然后在接收到信號(hào)時(shí)執(zhí)行一個(gè)方法。一旦方法完成,線程應(yīng)該回到睡眠狀態(tài),等待下一個(gè)信號(hào)。傳入的信號(hào)足夠頻繁,以至于我不希望每次信號(hào)傳入時(shí)都產(chǎn)生新線程的開(kāi)銷(xiāo)。目前,我正在輪詢信號(hào),但我相信有更好的方法來(lái)做到這一點(diǎn)。我見(jiàn)過(guò)使用 Handler 和 AsyncTask 的例子,但我不太確定最好的實(shí)現(xiàn)是什么。有什么建議么?public ModuleFeedbackTask extends Thread{    RadioModule radioModule;    public ModuleFeedbackTask(RadioModule radioModule)    {        this.radioModule = radioModule;    }    @Override    public void run()    {        //Previously just called the function        //moduleUpdateTask();        //Currently polling for an update        //What I want to do is sleep until I get some signal        while(mState == JOB_STATE_RUNNING)        {            //Poll module             moduleUpdateTask();            //Sleep            sleep(5);        }    }    public moduleUpdateTask()    {        //Check if module is ready for processing        if(radioModule.updateReady)        {            radioModule.updateReady = false; //Clear flag            //do some intensive stuff        }    }}/** * Callback when a radio module reports new data * @param m Radio module with new data */@Overrideprotected void onModuleStatusReport(RadioModule m){    if(mState == JOB_STATE_RUNNING)    {        //The below comments spawn a new thread on each feedback...         //I want to get around this        //ModuleFeedbackTask moduleFeedbackTask = new ModuleFeedbackTask(m);        //moduleFeedbackTask.setPriority(Thread.NORM_PRIORITY);        //moduleFeedbackTask.setName("ModFbTask");        //moduleFeedbackTask.start();        super.onModuleStatusReport(m);    }}
查看完整描述

1 回答

?
素胚勾勒不出你

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

有很多方法可以解決這個(gè)問(wèn)題,但我建議BlockingQueue在工作線程和任何其他可以發(fā)出信號(hào)以執(zhí)行其任務(wù)的線程之間使用共享。worker 的任務(wù)被設(shè)置在一個(gè)循環(huán)中,在循環(huán)的頂部它嘗試take()從隊(duì)列中獲取一個(gè)對(duì)象。這將阻塞,直到某個(gè)其他線程將一個(gè)對(duì)象排入隊(duì)列,該對(duì)象構(gòu)成了信號(hào)。

這種方法的一些優(yōu)點(diǎn)包括:

  • 您可以輕松自然地一次將多個(gè)信號(hào)排隊(duì),這樣如果在發(fā)布信號(hào)時(shí)工作人員實(shí)際上正在工作,則該信號(hào)不會(huì)丟失;

  • 您可以通過(guò)入隊(duì)對(duì)象向工作人員傳達(dá)信息,例如任務(wù)參數(shù)或退出信號(hào)而不是執(zhí)行任何任務(wù);

  • 您有一個(gè)內(nèi)置選項(xiàng)可以在接收信號(hào)時(shí)使用超時(shí);和

  • 所有BlockingQueue實(shí)現(xiàn)都是線程安全的,因此您無(wú)需擔(dān)心實(shí)現(xiàn)自己的同步。

示例

public OnDemandTask implements Runnable {

    private final BlockingQueue<?> signalQueue;


    public FeedbackTask(BlockingQueue<?> signalQueue) {

        this.signalQueue = signalQueue;

    }


    @Override

    public void run() {

        try {

            while (true) {

                // blocks until an object becomes available from the queue

                // may throw InterruptedException

                signalQueue.take();


                performTask();

            }

        } catch (InterruptedException ie) {

            // we've broken out of the loop; nothing further to do

        }

    }


    private performTask() {

        // ...

    }

}


查看完整回答
反對(duì) 回復(fù) 2022-06-30
  • 1 回答
  • 0 關(guān)注
  • 150 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(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)