執行緒基礎01
1.程式 行程 執行緒
- 程式(program):是為完成的特定任務,用某種語言撰寫的一組指令的集合,簡單來說,就是我們寫的代碼,
-
行程:
- 行程是指運行中的程式,比如我們使用QQ,就啟動了一個行程,作業系統就會為該行程分配空間,當我們使用迅雷,又啟動了一個行程,作業系統將為迅雷分配新的記憶體空間,
- 行程是程式的一次執行程序,或是正在運行的一個程式,是動態程序:有它自身的產生、存在和消亡的程序,
-
執行緒:
- 執行緒是由行程創建的,是行程的一個物體
- 一個行程可以有多個執行緒,比如:用迅雷同時下載多個檔案
-
其他相關概念:
- 單執行緒:同一時刻,只允許執行一個執行緒
- 多執行緒:同一時刻,可以執行多個執行緒,比如:一個qq行程,可以同時打開多個聊天視窗;一個迅雷行程,可以同時下載多個檔案,
- 并發:同一時刻,多個任務交替執行,造成一種“貌似同時”的錯覺,簡單地說,單核cpu實作的多任務就是并發
- 并行:同一時刻,多個任務同時執行,多核cpu可以實作并行,在電腦中也可能同時出現并發和并行的狀態,
例子:
package li.thread;
public class CpuNum {
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
//獲取當前的電腦的cpu數量
int cpuNums = runtime.availableProcessors();
System.out.println("當前的CPU數量="+cpuNums);//當前的CPU數量=8
}
}
2.執行緒的基本使用
- 創建執行緒的兩種方式
在java中執行緒來使用有兩種方法:
- 繼承Thread類,重寫run方法
- 實作Runnable介面,重寫run方法
2.1繼承Thread創建執行緒
例子1:執行緒應用案例1-繼承Thread類
1)請撰寫程式,開啟一個執行緒,該執行緒每隔一秒,在控制臺輸出 “喵喵,我是小貓咪”
2)對上題改進:當輸出80次“喵喵,我是小貓咪”時,結束該執行緒
3)使用JConsole監控執行緒執行情況,并畫出程式示意圖
package li.thread;
//演示通過繼承Thread類創建執行緒
public class Thread01 {
public static void main(String[] args) throws InterruptedException {
//創建一個Cat物件,可以當做執行緒來使用
Cat cat = new Cat();
cat.start();//啟動執行緒
//當main執行緒啟動一個子執行緒 Thread-0后,主執行緒不會阻塞,會繼續執行
//這時 主執行緒和子執行緒是交替執行
System.out.println("主執行緒繼續執行="+Thread.currentThread().getName());//主執行緒繼續執行=main
for (int i = 0; i < 60; i++) {
System.out.println("主執行緒 i="+i);
//讓主執行緒休眠
Thread.sleep(1000);
}
}
}
//1.當一個類繼承了Thread類,該類就可以當做一個執行緒使用
//2.我們會重寫run方法,寫上自己的業務代碼
//3.run Thread類實作了Runnable介面的run方法
/*
@Override
public void run() {
if (target != null) {
target.run();
}
}
*/
class Cat extends Thread {
@Override
public void run() {//重寫run方法,寫上自己的業務邏輯
int times = 0;
while (true) {
//該執行緒每隔1秒,在控制臺輸出 “喵喵,我是小貓咪”
System.out.println("喵喵,我是小貓咪" + (++times)+" 執行緒名稱="+Thread.currentThread().getName());
//讓該執行緒休眠一秒
try {
Thread.sleep(1000);//單位為毫秒 try-catch快捷鍵:Ctrl+Alt+T
} catch (InterruptedException e) {
e.printStackTrace();
}
if (times == 80) {
break;//當times到80,退出while,這是執行緒也就退出了
}
}
}
}
3)使用JConsole監控執行緒執行情況,并畫出程式示意圖:
如下,在控制臺點擊run,運行程式,在程式運行時,點擊Termial
在控制臺輸入JConsole,回車,
點擊本地行程,點擊Thread01,點擊下方連接按鈕:
在彈出視窗中點擊不安全的連接按鈕:
在視窗中點擊“執行緒”:
可以在左下角的執行緒小視窗中看到main執行緒和Thread-0執行緒在同時進行
等待一段時間,可以看到當run視窗的主執行緒 i = 60之后,main執行緒結束
結束前:
結束后:
當執行緒名稱=Thread-0輸出到80次時,雖然可以Thread-0還在左下角,但是實際上Thread-0執行緒已經結束了,整個行程隨之結束,
程式示意圖:

注意:在多執行緒編程里面,并不一定說主執行緒結束了,整個進行就結束了,等所有執行緒都結束了,行程才會結束,
2.2為什么是start?
在2.1的例子中,主方法中定義了cat物件,該物件呼叫了start方法,start方法會去啟動一個執行緒,最侄訓執行Cat 類的run方法,
思考一個問題:既然最終都是要呼叫run方法,為什么cat物件還要通過start方法對呼叫run呢?為什么不直接呼叫?
答案: 首先通過 物件.run() 方法 可以執行方法,但是不是使用的多執行緒的方式,就是一個普通的方法,沒有真正地啟動一個執行緒,即這時候把run方法執行完畢,才能執行主方法剩下的陳述句,
如下圖:將cat.start();改為cat.run();之后的運行結果:
在run方法執行完之后才執行主方法剩下的陳述句
那么在呼叫start方法時,整個程序到底是什么樣子的?
點擊start()方法:可以在start方法中看到一個start0()方法:
點擊start0( )方法:可以看到start0是一個本地方法,由 JVM呼叫,底層是c/c++實作,
再看看run()方法的原始碼:可以看到run方法只是簡單的呼叫了實作類的run,沒有進行任何的多執行緒處理,
換而言之,Java中真正實作多執行緒的效果的是start0方法,而不是run方法

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/503524.html
標籤:Java
上一篇:SpringMvc(二)- 請求處理引數 和 回應資料處理
下一篇:Python獲取時光網電影資料
