線程
-
程序
-
進程: 資源分配的基本單位。它擁有一個完整的虛擬地址空間。當進程發生調度時,不同的進程擁有不同的虛擬地址空間
-
線程: 有時被稱爲輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。
* 線程是進程中的一個實體,是被系統cup獨立**分配**和獨立**調度**的基本單位 * 線程與資源分配無關,線程自己不擁有系統資源,依附於進程 * 它可與同屬一個進程的其它線程共享進程所擁有的全部資源 * 一個線程可以創建和撤消另一個線程 * 同一進程中的多個線程之間可以併發執行 * 通常是在一個進程中包括多個線程,每個線程都是作爲利用CPU的基本單位,是花費最小開銷的實體
-
併發:當有多個線程在操作時,如果系統只有一個CPU,則它根本不可能真正同時進行一個以上的線程,它只能把CPU運行時間劃分成若干個時間段,再將時間 段分配給各個線程執行,在一個時間段的線程代碼運行時,其它線程處於掛起狀。.這種方式我們稱之爲併發(Concurrent)。
-
並行:當系統有一個以上CPU時,則線程的操作有可能非併發。當一個CPU執行一個線程時,另一個CPU可以執行另一個線程,兩個線程互不搶佔CPU資源,可以同時進行,這種方式我們稱之爲並行(Parallel)。
創建方式
- 繼承Thread
- 實現Runnable
- 匿名內部類
- lambda表達式
- 實現Callable FutureTask Thread(futureTask)
- Timer TimerTask (quartz)
- spring @EnableAsync @Async
常見方法
類方法(靜態)
- Thread.sleep(long mi); //休眠
進入阻塞狀態,釋放cup,不會釋放鎖 - Thread.currentThread(); //當前線程
- Thread.yield(); //native 方法
執行狀態中,變成可執行狀態,不確定釋放釋放鎖~~ - Thread.interrupted(); ()->boolean
對象方法 : t = new Thread();
-
t.start() ; // 開啓線程
只能start一次,java.lang.IllegalThreadStateException
-
t.getName(); //當前線程的名字
-
t.getPriority(); //優先級
【1,10】(默認值爲5)Thread.MIN_PRIORITY, Thread.NORM_PRIORITY , Thread. MAX_PRIORITY 越高不能保證,必定先執行,雖然概率低了點,但總會有他執行的機會
-
t.setDaemon(true) ; //
設置守護線程 GC:垃圾回收器,他是一個守護線程,一般的Thread 都是用戶線程 ; 當全部用戶線程dead , 守護線程自行關閉
-
t.join();
加入到默認(當前)線程,當前線程進入阻塞狀態,t線程執行.
-
t.interrupt() // 中斷 , this.isInterrupted() true
this.isInterrupted() true 如果線程在sleep,wait , 會拋異常 java.lang.InterruptedException: sleep interrupted java.lang.InterruptedException
-
t.isInterrupted(); ()->boolean 是否中斷, 和
-
t.isAlive() //native
廢棄方法
- t.stop(); //立即停止當前線程, 後續代碼不會執行,即使線程在阻塞狀態也不會拋異常,有可能資源未釋放
生命週期
週期
-
NEW:通過New關鍵字創建了Thread類(或其子類)的對象。
-
RUNNABLE:這種情況指的是Thread類的對象調用了start()方法,這時的線程就等待時間片輪轉到自己這,以便獲得CPU;第二種情況是線程在處於RUNNABLE狀態時並沒有運行完自己的run方法,時間片用完之後回到RUNNABLE狀態;還有種情況就是處於BLOCKED狀態的線程結束了當前的BLOCKED狀態之後重新回到RUNNABLE狀態。
-
RUNNING:獲得CPU的RUNNABLE線程,執行程序指令。
-
BLOCKED:處於RUNNING狀態的線程,出於某種原因,而讓出當前的CPU給其他的線程。
-
DEAD:處於RUNNING狀態的線程,在執行完run方法之後,就變成了DEAD狀態了。
當共享資源被多個線程併發訪問時,通過對象鎖控制,其中一個線程獲取對象鎖時,其他線程就進入了一個鎖池(Lock pool);當鎖被釋放,另一個線程獲得了鎖,就變爲可運行狀態。主要是wait和notify方法。線程調用了wait()方法之後,釋放掉鎖,進入等待池(Wait pool) ;收到通知之後等待獲取鎖,獲取鎖之後纔可以運行。
阻塞 blocked
1.調用sleep(毫秒數),使線程進入睡眠狀態。在規定時間內,這個線程是不會運行的。
2.調用join([毫秒數]),當前線程進入阻塞狀態,直到join的線程執行完畢或指定毫秒數之後。
3.用wait()暫停了線程的執行。除非線程收到 notify()或 notifyAll()消息,否則不會變成“可運行”狀態。
4. 線程正在等候一些IO操作完成。
5. 線程試圖調用另一個對象的“同步”方法,但那個對象處於鎖定狀態,暫時無法使用。
Wait pool 等待池 Lock pool 鎖池
線程狀態
- BLOCKED
受阻塞並且正在等待監視器鎖的某一線程的線程狀態。
- NEW
至今尚未啓動的線程的狀態。
- RUNNABLE
可運行線程的線程狀態。
- TERMINATED
已終止線程的線程狀態。
- TIMED_WAITING
具有指定等待時間的某一等待線程的線程狀態。
- WAITING
某一等待線程的線程狀態。