Java 線程相關(guān)總結(jié)
一、線程的生命周期
1.五種狀態(tài):新建狀態(tài)、就緒狀態(tài)、運行狀態(tài)、阻塞狀態(tài)、消亡狀態(tài)
2.就緒狀態(tài)的線程表示有權(quán)利去獲取CPU的時間片,CPU時間片是執(zhí)行權(quán),當線程拿到CPU時間片之后就馬上執(zhí)行run方法,這個時候就代表進入了運行狀態(tài)
二、線程的調(diào)度與控制
通常我們的計算機只有一個CPU,CPU在某一個時刻只能執(zhí)行一條指令,線程只有得到CPU時間片,也就是使用權(quán),才可以執(zhí)行指令。在單CPU的機器上線程不是并行運行的,只有個在多個CPU上線程才可以并行運行。Java虛擬機要負責線程的調(diào)度,取得CPU的使用權(quán),目前有兩種調(diào)度模型:分時調(diào)度模型和搶占式調(diào)度模型,Java使用搶占式調(diào)度模型。
分時調(diào)度模型:所有線程輪流使用CPU的使用權(quán),平均分配每個線程占用CPU的時間片;
搶占式調(diào)度模型:優(yōu)先讓優(yōu)先級高的線程使用CPU,如果線程的優(yōu)先級相同,那么會隨機選擇一個,優(yōu)先級高的線程獲取CPU時間片相對多一些。
線程優(yōu)先級主要分為三種:MAX_PRIORITY(最高級);MIN_PRIORITY(最低級);NORM_PRIORITY(標準)默認
package com.bjpowernode.java_learning; import com.sun.imageio.plugins.tiff.TIFFT4Compressor; public class D104_1_MultiThreadDispatchAndControl { public static void main(String[] args) { //如何獲取當前線程對象 Thread t = Thread.currentThread();//t保存的內(nèi)存地址指向的是線程是“主線程對象” //獲取線程的名字 System.out.println(t.getName()); Thread t2 = new Thread(new Processor104_1()); t2.start(); Thread t3 = new Thread(new Processor104_1()); t3.start(); //可以給線程起名字 Thread t4 = new Thread(new Processor104_1()); t4.setName("t4"); t4.start(); } } class Processor104_1 implements Runnable{ public void run() { Thread t = Thread.currentThread(); System.out.println(t.getName()); } }
三、線程的優(yōu)先級
1.線程優(yōu)先級的獲取的CPU時間片會相對多一點
(1)優(yōu)先級為1-10
(2)最低為1
(3)最高為10
(4)默認為5
package com.bjpowernode.java_learning; public class D105_1_PriorotyOfMultithread { public static void main(String[] arsg) { System.out.println(Thread.MAX_PRIORITY); System.out.println(Thread.MIN_PRIORITY); System.out.println(Thread.NORM_PRIORITY); System.out.println("================="); Thread t1 = new Processor105(); t1.setName("t1"); Thread t2 = new Processor105(); t2.setName("t2"); System.out.println(t1.getPriority()); System.out.println(t2.getPriority()); //設(shè)置優(yōu)先級 t1.setPriority(5); t2.setPriority(4); t1.start(); t2.start(); } } class Processor105 extends Thread{ public void run() { for(int i=0;i<5;i++) { System.out.println(Thread.currentThread().getName()+"--->"+i); } } }
四、源碼:
D105_1_PriorotyOfMultithread.java
https://github.com/ruigege66/Java/blob/master/D105_1_PriorotyOfMultithread.java
D104_1_MultiThreadDispatchAndControl.java
https://github.com/ruigege66/Java/blob/master/D104_1_MultiThreadDispatchAndControl.java
以上就是Java 線程相關(guān)總結(jié)的詳細內(nèi)容,更多關(guān)于Java 線程的資料請關(guān)注腳本之家其它相關(guān)文章!
- Java線程阻塞方法sleep()與wait()的全面講解
- 聊聊Java中是什么方法導致的線程阻塞
- java并發(fā)包中CountDownLatch和線程池的使用詳解
- java多線程中執(zhí)行多個程序的實例分析
- Java多線程實現(xiàn)簡易微信發(fā)紅包的方法實例
- Java 線程池的作用以及該如何使用
- 在windows下揪出java程序占用cpu很高的線程并完美解決
- java多線程數(shù)據(jù)分頁處理實例講解
- Java使用多線程異步執(zhí)行批量更新操作方法
- Java線程池配置的一些常見誤區(qū)總結(jié)
- 深入理解 Java、Kotlin、Go 的線程和協(xié)程
- Java線程的6種狀態(tài)及切換教程
- java 優(yōu)雅關(guān)閉線程池的方案
- Java實現(xiàn)多線程模擬龜兔賽跑
- Java線程中賣火車票問題的深入講解
相關(guān)文章
Java圖形界面之JFrame,JLabel,JButton詳解
這篇文章主要介紹了Java圖形界面之JFrame、JLabel、JButton詳解,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04springboot接口如何多次獲取request中的body內(nèi)容
這篇文章主要介紹了springboot接口多次獲取request中的body內(nèi)容的過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06Java 為什么要避免使用finalizer和Cleaner
這篇文章主要介紹了Java 為什么要避免使用finalizer和Cleaner,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下2021-03-03Java利用EasyExcel解析動態(tài)表頭及導出實現(xiàn)過程
以前做導出功能,表頭和數(shù)據(jù)都是固定的,下面這篇文章主要給大家介紹了關(guān)于Java利用EasyExcel解析動態(tài)表頭及導出實現(xiàn)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-12-12SpringBoot2.x配置多數(shù)據(jù)源方式
這篇文章主要介紹了SpringBoot2.x配置多數(shù)據(jù)源方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03JDK1.8使用的垃圾回收器和執(zhí)行GC的時長以及GC的頻率方式
這篇文章主要介紹了JDK1.8使用的垃圾回收器和執(zhí)行GC的時長以及GC的頻率方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05