多線程併發——HandlerThread

HandlerThread本質上就是一個普通Thread,只是這個線程內部有一個looper,而這個looper有一個消息隊列MessageQue,它經過不斷的用looper去檢查MessageQue而後取出消息而後處理。html

基本用法

建立一個HandlerThread網絡

mThread = new HandlerThread("handler_thread");app

啓動一個HandlerThreadide

mThread.start();oop

示例

方式一ui

public class MainActivity extends AppCompatActivity {

    private HandlerThread myHandlerThread ;
    private Handler handler ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //建立一個線程,線程名字:handler-thread
        myHandlerThread = new HandlerThread( "handler-thread") ;
        //開啓一個線程
        myHandlerThread.start();
        //在這個線程中建立一個handler對象
        handler = new Handler( myHandlerThread.getLooper() ){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //這個方法是運行在 handler-thread 線程中的 ,能夠執行耗時操做
                Log.d( "handler " , "消息: " + msg.what + "  線程: " + Thread.currentThread().getName()  ) ;

            }
        };

        //在主線程給handler發送消息
        handler.sendEmptyMessage( 1 ) ;

        new Thread(new Runnable() {
            @Override
            public void run() {
             //在子線程給handler發送數據
             handler.sendEmptyMessage( 2 ) ;
            }
        }).start() ;

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        //釋放資源
        myHandlerThread.quit() ;
    }
}

運行效果:.net

/com.app D/handler: 消息: 1  線程: handler-thread
/com.app D/handler: 消息: 2  線程: handler-thread

方式二線程

首先繼承了HandlerThread,並實現了 Handler.Callback的接口code

private class MyHandlerThread extends HandlerThread implements Handler.Callback {
        public MyHandlerThread(String name) {
            super(name);
        }
        @Override
        public boolean handleMessage(Message msg) {
            System.out.println("handleMessage CurrentThread=" + Thread.currentThread().getName());
            handlerUi.sendEmptyMessage(i);
            i++;
            return false;
        }
    }

初始化該handlerThread並啓動htm

handlerThread = new MyHandlerThread("myHandler");
 handlerThread.start();

Ui線程獲取能給HandlerThread發消息的Handler

handler = new Handler(handlerThread.getLooper(), handlerThread);

使用場景

HandlerThread 的使用場景

HandlerThread 所作的就是在新開的子線程中建立了 Looper,那它的使用場景就是 Thread + Looper 使用場景的結合,即:在子線程中執行耗時的、可能有多個任務的操做。

好比:多個下載任務 具體實例可參考連接:http://blog.csdn.net/u011240877/article/details/72905631

HandlerThread的特色

  • HandlerThread將loop轉到子線程中處理,說白了就是將分擔MainLooper的工做量,下降了主線程的壓力,使主界面更流暢。

  • 開啓一個線程起到多個線程的做用。處理任務是串行執行,按消息發送順序進行處理。HandlerThread本質是一個線程,在線程內部,代碼是串行處理的。

  • 可是因爲每個任務都將以隊列的方式逐個被執行到,一旦隊列中有某個任務執行時間過長,那麼就會致使後續的任務都會被延遲處理。

  • HandlerThread擁有本身的消息隊列,它不會干擾或阻塞UI線程。

  • 對於網絡IO操做,HandlerThread並不適合,由於它只有一個線程,還得排隊一個一個等着。

參考連接:

https://www.cnblogs.com/zhaoyanjun/p/6062880.html

http://blog.csdn.net/u014449046/article/details/51152701

相關文章
相關標籤/搜索