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

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

如何向 Android 線程發出信號以執行方法?

如何向 Android 線程發出信號以執行方法?

慕碼人8056858 2022-06-30 11:51:32
我想產生一個休眠的線程,然后在接收到信號時執行一個方法。一旦方法完成,線程應該回到睡眠狀態,等待下一個信號。傳入的信號足夠頻繁,以至于我不希望每次信號傳入時都產生新線程的開銷。目前,我正在輪詢信號,但我相信有更好的方法來做到這一點。我見過使用 Handler 和 AsyncTask 的例子,但我不太確定最好的實現是什么。有什么建議么?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貢獻1827條經驗 獲得超9個贊

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

這種方法的一些優點包括:

  • 您可以輕松自然地一次將多個信號排隊,這樣如果在發布信號時工作人員實際上正在工作,則該信號不會丟失;

  • 您可以通過入隊對象向工作人員傳達信息,例如任務參數或退出信號而不是執行任何任務;

  • 您有一個內置選項可以在接收信號時使用超時;和

  • 所有BlockingQueue實現都是線程安全的,因此您無需擔心實現自己的同步。

示例

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

        // ...

    }

}


查看完整回答
反對 回復 2022-06-30
  • 1 回答
  • 0 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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