JAVA常用多線程知識大全(一)

一.  創建線程方法包括:

1. 繼承Thread創建後調用start()方法啓動;

2. 實現runnable接口後作爲Thread的target創建,調用Thread的start()方法啓動;

3.實現Callable<>接口作爲Future<>的target創建,調用Future<>的Start()方法啓動線程,後續可以調用get()方法獲取Callable<>返回值(該方法會阻塞當前線程)

二. 控制線程:

1. Thread的join()方法可以讓當前線程阻塞直被join()的線程執行完畢,支持join(long millis)指定最大等待時間;

2. 調用Thread的setDaemon(true)可以將線程設置爲後臺線程,後臺線程將在所有非後臺線程死亡後自動死亡;

3. 調用 Thread的sleep(long millis)可以讓當前線程被阻塞指定時間長度;

4. 調用Thread的yield()方法會將當前線程轉入就緒(非阻塞)狀態,線程調度器會重新調度(該線程也有可能被調度器重啓啓動)5. 調用Thread的setPriority(int newPriority)和getPriority()方法可以設置和獲取指定線程的優先級,高優先級線程有較多的機會被執行。

三. 線程同步:

1. 使用synchronized(obj){...}可以同步代碼塊,obj就是同步監視器;

2. 使用synchronized可以同步非static方法,無須顯式指定監視器,採用this作爲監視器; 

3. 同步方法和同步代碼塊執行完畢、拋出異常、執行了同步檢視對象的wait()會釋放同步監視器,調用sleep()和yield()不會釋放同步監視器;

4. 使用Lock可以實現比synchronized更靈活的同步控制,常用的是ReentrantLock類,使用該類的lock()和unlock()方法實現;

四. 線程通信

1. wait() / notify() / notifyAll(),用於使用了相同監視對象的線程進行同步。意義分別爲導致當前線程等待(可設置最長等待時間),隨機喚醒單個等待線程,喚醒所有等待線程,要注意對於使用synchronized修飾的同步方法,this就是同步監視器,可以直接調用這幾個方法,如果是synchronized修飾同步代碼塊,同步監視器是synchronized括號裏面的對象,必須使用這個對象的這幾個方法。注意一點這幾個方法只是程序阻塞和繼續,跟synchronized和lock控制的線程阻塞,死鎖等有區別;

2. Condition控制線程通信,對於使用lock而非synchronized來保證同步的程序,使用Lock對象的new Condition()方法可以獲取Condition對象,該對象有await() / signal() / signalAll() 方法,功能和上面的 wait() / notify() / notifyAll()類似

3. 阻塞隊列(BlockingQueue)控制線程隊列,BlockingQueue主要用來控制線程同步,實現類有ArrayBlockingQueue, LinkedBlockingQueue等,提供put(E e)和take()兩個方法控制線程同步,前者嘗試把元素放入阻塞隊列,如果隊列已滿(初始化隊列時需要指定隊列容量),則阻塞當前線程;後者嘗試從隊列中取出頭部元素,如果當前隊列爲空,則阻塞當前線程。

發佈了30 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章