1. 程式人生 > >Java:多執行緒基礎

Java:多執行緒基礎

Java中的多執行緒

程序:一個程式的執行
執行緒:程式中某個順序的流程控制,通俗來講,就是不同的任務
一個程序可以有多個執行緒

執行緒的分類

  • 普通執行緒(非Daemon執行緒)
    在Java中,如果還有非Daemon執行緒,整個程式就不會結束
  • Daemon執行緒(守護執行緒,後臺執行緒)
    如果不存在Daemon執行緒,則後臺執行緒自動終止
    ps:辣雞回收執行緒是後臺執行緒

執行緒的建立

  • 方法一 通繼承Thread類來建立執行緒
class ThreadPractice extends Thread{
    @Override
    public
void run(){ ...... ...... }; } //匿名內部類 Thread td = new Thread(){ @Override public void run{ method(something); } private void method(型別 變數名){ ....... } };
  • 方法二 通過向Thread()構造方法傳遞Runnable物件來建立執行緒
class ThreadPractice implements Runnable
{
public void run(){}; }

執行緒的控制

  • 啟動
    start();

  • 暫停
    try{
    Thread.sleep(ms);
    }catch(InterruptedException e){ }

  • 結束

    • Daemon執行緒在無非Daemon執行緒時自動結束
    • run執行完自動結束
    • 線上程的while(true)迴圈中使用標記變數退出

執行緒安全

同時執行的執行緒需要共享資料,那麼則需要考慮執行緒安全,考慮執行緒安全即是實現同步

如 兩個執行緒都對一項資料進行操作,執行緒A取出該資料進行運算後還未更新該資料,而執行緒B又取出該資料一次,則某個執行緒的操作就被忽略了 要避免這一狀況,就需要考慮執行緒安全

//執行緒不安全示例
public class ThreadSafe {

    private static int cnt;

    public static void main(String[] args) {
        final int NUM=500;
        Thread [] threads = new Thread[NUM];
        for (int i=0;i<NUM;i++){
            threads[i] = new Thread(){

                @Override
                public void run() {
                    int i = 0;
                    while(i++<1000)
                    cnt++;
                }
            };
        }

        for (Thread thread : threads){
            thread.start();
        }
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(cnt+"       "+ String.valueOf(cnt==NUM*1000));
    }

}

使用synchroinzed修飾符使執行緒同步

在Java中,每個物件都對應於一個monitor,其中有一個成為 互斥鎖(lock,muyex) 的標記,該標記用來保證任意時刻,只能有一個執行緒訪問該物件

synchronized的用法

  • 對程式碼片段:synchronized (物件) {    }
  • 對某個方法:synchronized 放在方法宣告中,等價於synchronized(this),表明整個方法為同步方法

wait( )、notify( )/notifyAll( )函式控制執行緒

  • wait釋放鎖,使當前執行緒進入等待狀態
  • notify喚醒等待當前物件的執行緒,僅喚醒一個,若有多個選項,由作業系統決定
  • notifyAll喚醒所有等待該物件的執行緒
  • notify/notifyAll未釋放鎖,待synchronized臨界區結束後鎖才釋放
  • 被喚醒的執行緒一定先處於wait狀態

2018/8/11