多執行緒簡介
1.Process與Thread
- 程式本身是指定和資料的有序集合,其本身沒有任何運行的含義,是一個靜態的概念,
- 而行程則是執行程式中的一次執行程序,是一個動態的概念,是系統能夠資源分配的單位,
- 通常在一個行程里,可以包含若干個執行緒,當然一個行程至少有一個執行緒,不然沒有存在的意義,
- 執行緒是CPU調度和執行的單位,執行緒是獨立的執行路徑
注:很多的多執行緒是模擬出來的,真正的多執行緒是指有多個cpu,即多核,如服務器,如果模擬出來的多執行緒,即在一個cpu的情況下,在同一個時間點,cpu只能執行一個代碼,因為切換的很快,所有就有同時執行的錯覺
- 在程式運行時,及時沒有為自己創建執行緒,后臺也會有多個執行緒,如主執行緒,gc執行緒等,
- main()稱為主執行緒,為系統的入口,用于執行整個程式
- 在一個執行緒中,如果開辟了多個執行緒,執行緒的運行由調度器安排調度,調度器是與作業系統緊密相關的,先后順序是不能人為的干預的,
- 對同一份資源操作時,會存在資源搶奪的問題,需要加入并發控制,
- 執行緒會帶來額外的開銷,如cpu調度時間,并發控制開銷
- 每個執行緒在自己的作業記憶體互動,記憶體控制不當會造成資料不一致
- 對現在的程式來說至少需要兩個執行緒,一個是執行main方法的主執行緒,一個垃圾回收(gc)執行緒.
2.執行緒的創建
? 我們現在一共有三種方式創建執行緒,分別是繼承Threa類,
2.1通過繼承Thread類創建
//創建方式一:繼承Thread類,重寫run()方法,呼叫start開啟執行緒
package com.thread;
public class ThreadTest01 {
public static void main(String[] args) {
MyThread01 myThread01 = new MyThread01();
myThread01.start();
//start()方法的作用是:啟動一個分支執行緒,在JVM中開辟一個新的堆疊空間,這段代碼在任務完成之后,瞬間就結束了
//這段代碼的任務只是為了開啟一個新的堆疊空間,只要新的堆疊空間開出來,start ()方法就結束了,執行緒就啟動成功了
//啟動成功的執行緒會自動呼叫run方法,并且run方法在分支線的堆疊底部(壓線)
//run()方法在分支堆疊的堆疊底部,man方法在主堆疊的堆疊底部,run和main是平級的
//muThread01.run;不會啟動執行緒,不會分配新的分支線(這就是單執行緒)
for (int i = 0; i < 100; i++) {
System.out.println("主執行緒"+i);
}
}
static class MyThread01 extends Thread{
@Override
public void run() {
//撰寫程式,這段程式運行在分支執行緒中
for (int i = 0; i < 100; i++) {
System.out.println("分支執行緒"+i);
}
}
}
輸出:因為輸出較多,我們截取一部分,可以看出,是交替執行的,
主執行緒8
分支執行緒68
分支執行緒69
主執行緒9
分支執行緒70
分支執行緒71
分支執行緒72
分支執行緒73
分支執行緒74
分支執行緒75
分支執行緒76
主執行緒10
分支執行緒77
主執行緒11
分支執行緒78
主執行緒12
分支執行緒79
主執行緒13
分支執行緒80
主執行緒14
分支執行緒81
主執行緒15
主執行緒16
分支執行緒82
主執行緒17
執行緒開啟不一定立即執行,是由cpu安排調度的
2.2撰寫一個類實作java.lang.Runnable介面
代碼示例:
public class ThreadTest03 {
public static void main(String[] args) {
//創建執行緒物件
Thread t = new Thread(new MyRunnable());
//啟動執行緒
t.start();
for (int i = 0; i < 100; i++) {
System.out.println("主執行緒"+i);
}
}
//這并不是一個執行緒類,是一個可運行的類,還不是一個執行緒
static class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("分支執行緒"+i);
}
}
}
}
部分輸出結果:
分支執行緒31
分支執行緒32
主執行緒45
主執行緒46
主執行緒47
主執行緒48
主執行緒49
主執行緒50
主執行緒51
主執行緒52
主執行緒53
主執行緒54
主執行緒55
主執行緒56
主執行緒57
主執行緒58
主執行緒59
主執行緒60
主執行緒61
分支執行緒33
分支執行緒34
分支執行緒35
分支執行緒36
分支執行緒37
分支執行緒38
分支執行緒39
注:第二種方式實作介面比較常見,因為一個類實作了皆可以,還可以去繼承其它的類,更加靈活!
3.多執行緒并發
-
行程與行程之間的記憶體獨立不共享
-
在一個行程中,執行緒和執行緒的堆記憶體和方法區記憶體共享,但是堆疊記憶體獨立,一個執行緒一個堆疊
假設啟動十個執行緒,就會有十個堆疊空間,每個堆疊與每個堆疊之間,互不干擾,各自執行,這就是多執行緒并發
本文來自博客園,作者:星余明,轉載請注明原文鏈接:https://www.cnblogs.com/lingstar/p/16529082.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/500525.html
標籤:其他
