Thread的使用

思維導圖如下


Thread.png

進程是程序的一次動態執行過程,它需要經歷從代碼加載,代碼執行到執行完畢的一個完整的過程,這個過程也是進程本身從產生,發展到最終消亡的過程。多進程操作系統能同時達運行多個進程(程序),由于 CPU 具備分時機制,所以每個進程都能循環獲得自己的CPU 時間片。由于 CPU 執行速度非常快,使得所有程序好像是在同時運行一樣。
多線程是實現并發機制的一種有效手段。進程和線程一樣,都是實現并發的一個基本單位。線程是比進程更小的執行單位,線程是進程的基礎之上進行進一步的劃分。所謂多線程是指一個進程在執行過程中可以產生多個更小的程序單元,這些更小的單元稱為線程,這些線程可以同時存在,同時運行,一個進程可能包含多個同時執行的線程。
在 Java 中實現多線程有兩種手段,一種是繼承 Thread 類,另一種就是實現 Runnable 接口。
Thread 類和 Runnable 接口之間在使用上也是有區別的,如果一個類繼承 Thread類,則不適合于多個線程共享資源,而實現了 Runnable 接口,就可以方便的實現資源的共享。

一個多線程的程序如果是通過 Runnable 接口實現的,則意味著類中的屬性被多個線程共享,那么這樣就會造成一種問題,如果這多個線程要操作同一個資源時就有可能出現資源同步問題。
解決方法:

同步代碼塊

synchronized(同步對象){ 
 需要同步的代碼 
}

實例代碼如下:

class MyThread implements Runnable{ 
    private int ticket = 5 ;    // 假設一共有5張票 
    public void run(){ 
        for(int i=0;i<100;i++){ 
            synchronized(this){ // 要對當前對象進行同步 
                if(ticket>0){   // 還有票 
                    try{ 
                        Thread.sleep(300) ; // 加入延遲 
                    }catch(InterruptedException e){ 
                        e.printStackTrace() ; 
                    } 
                    System.out.println("賣票:ticket = " + ticket-- ); 
                } 
            } 
        } 
    } 
}; 
public class SyncDemo02{ 
    public static void main(String args[]){ 
        MyThread mt = new MyThread() ;  // 定義線程對象 
        Thread t1 = new Thread(mt) ;    // 定義Thread對象 
        Thread t2 = new Thread(mt) ;    // 定義Thread對象 
        Thread t3 = new Thread(mt) ;    // 定義Thread對象 
        t1.start() ; 
        t2.start() ; 
        t3.start() ; 
    } 
};

同步方法

synchronized 方法返回值 方法名稱(參數列表){ 

}
class MyThread implements Runnable{ 
    private int ticket = 5 ;    // 假設一共有5張票 
    public void run(){ 
        for(int i=0;i<100;i++){ 
            this.sale() ;   // 調用同步方法 
        } 
    } 
    public synchronized void sale(){    // 聲明同步方法 
        if(ticket>0){   // 還有票 
            try{ 
                Thread.sleep(300) ; // 加入延遲 
            }catch(InterruptedException e){ 
                e.printStackTrace() ; 
            } 
            System.out.println("賣票:ticket = " + ticket-- ); 
        } 

    } 
}; 
public class SyncDemo03{ 
    public static void main(String args[]){ 
        MyThread mt = new MyThread() ;  // 定義線程對象 
        Thread t1 = new Thread(mt) ;    // 定義Thread對象 
        Thread t2 = new Thread(mt) ;    // 定義Thread對象 
        Thread t3 = new Thread(mt) ;    // 定義Thread對象 
        t1.start() ; 
        t2.start() ; 
        t3.start() ; 
    } 
};

其實就是在實現了Runnable接口的類中的run方法中寫代碼,然后new一個Thread,用Thread的start方法來啟動另外的線程去執行run方法中的代碼
參考文章
Java多線程看這一篇就足夠了

-------------------------------------------------------------------------

android開發藝術中關于HandlerThread的介紹

HandlerThread的run方法是一個無限循環,因此當明確不需要再使用Handler時,可以通過它的quit或者quitSafely方法來終止線程的執行。代碼如下所示:

 HandlerThread handlerThread = new HandlerThread("我是HandlerThread");
        handlerThread.start();
        Handler handler = new Handler(handlerThread.getLooper()) {//創建Handler對象時,如果添加了Loop參數,那么Handler將被創建在Loop所在的線程中
            @Override
            public void handleMessage(Message msg) {
            //這個方法是運行在 handler-thread 線程中的 ,可以執行耗時操作
                switch (msg.what) {
                    case 0:
                        Log.d("CeShi",Thread.currentThread().getName()+ ":收到了");
                        break;
                    default:
                        break;
                }
            }
        };
        handler.sendEmptyMessage(0);//在主線程給handler發送消息
        /*輸出結果為:
        05-24 18:29:57.487 32249-32266/? D/CeShi: 我是HandlerThread:收到了*/

參考文章
https://www.cnblogs.com/zhaoyanjun/p/6062880.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,982評論 19 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,767評論 18 399
  • 下面是我自己收集整理的Java線程相關的面試題,可以用它來好好準備面試。 參考文檔:-《Java核心技術 卷一》-...
    阿呆變Geek閱讀 14,909評論 14 507
  • 我有兩個自己 一個用來愛 一個用來承受 影子是承受的最真實的存在 比起影子 更愛最初的心 如果微笑給不了別人溫暖 ...
    汐的島閱讀 333評論 0 1
  • 《代碼大全》第5章 軟件構建中的設計 讀書筆記 管理軟件的復雜度 設計層次 1. 軟件系統 2. 子系統或包 常用...
    息魘閱讀 967評論 0 0