1. 程式人生 > >多線程&定時器Timer&同步&線程通信&ThreadLocal

多線程&定時器Timer&同步&線程通信&ThreadLocal

技術分享 mar ribbon ++ AI ring 線程組 com fast

技術分享圖片

1.多線程

  • 線程狀態分為:新建狀態、就緒狀態、運行狀態、阻塞狀態、死亡狀態
    • 對象等待池的阻塞狀態:運行狀態執行了wait方法
    • 對向鎖池的阻塞狀態:試圖獲得某個同步鎖,已經被其他線程占用,就會放到對象的鎖池中
    • 其他阻塞狀態:執行了sleep()方法、join方法()
  • 線程睡眠Thread.sleep()方法:當前線程放棄cpu,轉到阻塞狀態
  • 線程讓步Thead.yield()靜態方法:如果此時具有相同優先級的其他線程處於就緒狀態,那麽 yield()方法將把當前運行的線程放到可運行池中並使另一個線程運行。如果沒有相同優先級的可運行線程,則此方法什麽都不做。
  • 等待其他線程結束 join()方法:當前運行的線程可以調用另一個線程的 join()方法,當前運行的線程將轉到阻塞狀態,直至另一個線程運行結束,它才恢復運行。
  • machin.join() 就是執行的這個線程停止讓給machin線程運行
  • 設置後臺線程 Thread.setaemon(true)方法,就可以把當前線程設置為後臺線程

2.定時器Timer

Timer timer = new Timer(true) //把與Timer關聯的線程設置為後臺線程
TimerTask task = new TimerTask(){//匿名內部類實現run方法
    timer.schedule(task,10,500); //
task用來設定所要定時器執行的任務;10為延遲執行的時間ms;500為每隔500ms重復執行一次任務 }

2.同步

  • 同步代碼塊
    • synchronized(this){} this表示引用當前類對象的鎖
  • 同步方法鎖
    • public synchronized String pop(){}
  • 什麽情況會釋放鎖?
    • 執行完同步代碼塊,就會釋放鎖
    • 在執行同步代碼塊的過程中,遇到異常而導致線程終止,鎖也會被釋放
    • 在執行同步代碼塊的過程中,執行了鎖所屬對象的wait()方法,這個線程會釋放鎖,進入對象的等待池
  • 什麽情況不會釋放鎖?
    • 在執行同步代碼塊的過程中,執行了 Thread.sleep()方法,當前線程放棄 CPU,開始睡眠,在睡眠中不會釋放鎖
    • 在執行同步代碼塊的過程中,執行了 Thread.yield()方法,當前線程放棄 CPU,但不會釋放鎖
    • 在執行同步代碼塊的過程中,其他線程執行了當前線程對象的 supend()發昂發,當前線程被暫停,但不會釋放鎖。Thread類的 supend()方法已經被廢棄

3.線程通信

  • wait():執行該方法的線程釋放對象的鎖,Java虛擬機把該線程放到該對象的等待池中。該線程等待其他線程將它喚醒
  • notify():執行該方法的線程喚醒在對象的等待池中等待的一個線程。Java虛擬機從對象等待池中隨機選擇一個線程,把它轉到對象的鎖池中

4.中斷阻塞

  • 當線程 A 處於阻塞狀態時, 如果線程 B 調用線程 A 的 interrupt()方法,那麽線程 A 會接收到一個 InterruptedException,並退出阻塞狀態,開始進行異常處理

5.線程控制

  • start():啟動線程
  • suspend():使線程暫停(被廢棄)
  • resume():使暫停的線程恢復運行(被廢棄)
  • stop()::終止線程(被廢棄)

6.線程組

  • ThreadGroup類的 activeCount()方法:獲得當前或者的線程的數目
  • ThreadGroup類的 enumerate(machines)方法:該方法把當前活著的線程引用存放到參數machines中
  • main(){
        ThreadGroup group = new ThreadGroup("machines");
        for(int i = 1;i <= 5;i++){
            Machine machine = new Machine(group,"machine"+i);
            machine.start();
        }
        int activeCount = group.activeCount();
        Thread[] machines = new Thread[activeCount];
        group.enumerate(machines);
        for(int i = 0;i < activeCount;i++)
            syso(machines[i].getName()+" is alive");
    }            

7.ThreadLocal

  • ThreadLocal類 可以用來存放線程的局部變量,每個線程都有單獨的局部變量,彼此之間不會共享
    •  public T get():返回當前線程的局部變量
    •  protected T initialValue():返回當前線程的局部變量的初始值
    •  public void set(T value):設置當前線程的局部變量
    •  ThreadLocal類中有一個Map 緩存,用戶存儲每一個線程的局部變量

多線程&定時器Timer&同步&線程通信&ThreadLocal