Java多線程編程總結一 – 初識多線程
進程、多進程、線程、多線程的概念
進程(process):CPU的執行路徑。通俗的說就是系統中正在運行的程序。比如我們打開了瀏覽器、QQ等等,這些程序一旦被打開運行了,就是所謂的進程。
多進程:系統中同時運行的多個程序。這個我們應該不難理解了,在打開瀏覽器的同時我們也可以QQ聊天、CS單機游戲等。
線程(thread):運行在進程中的運行單元。比如迅雷下載中我們的某一個下載任務就是一個線程。
多線程:同理可知,每個進程里面有多個獨立的或者相互有協作關系的運行單元我們稱之為多線程。
第一個多線程程序
Java中多線程的實現方式有兩種:繼承Thread父類、實現Runnable接口。
首先我們實現一個簡單的多線程的實現,交替執行程序並輸出1~20。
1 package MyJavaThread; 2 3 public class MyFirstThreadTest { 4 5 public static void main(String[] args) { 6 new Thread(new Runnable() { 7 public void run() { 8 int i=1; 9 while (i<=20) { 10 System.out.println(Thread.currentThread().getName() + ": " + i++); 11 } 12 } 13 }).start(); 14 15 int i=20; 16 while (i>0) { 17 System.out.println(Thread.currentThread().getName() + ": " + i--); 18 } 19 } 20 }
部分截圖如下
沒有真正意義上的多線程
我們知道,CPU在同一時刻只能給一個程序分配資源(單核情況下),也就是賦予一個程序運行權力,那么我們看到一次能運行好幾個程序其實是CPU來回切換執行權產生的效果。因而讓人們覺得是並發運行的,只是CPU切換的速度非常快罷了。
線程的狀態
線程有自己的狀態,我們稱為生命周期:初始狀態、運行狀態、凍結狀態和終止狀態。
線程的朝陽--初始化狀態
線程的初始化就是我們所說的創建了一個線程,也就是實例化了一個Thread的子類,等着被start。
線程的青春--運行狀態
當我們調用了start方法的時候,此時線程就處於了運行狀態。但是嚴謹的說,此時線程不一定就會馬上運行,它處於一個臨時狀態,即在CPU的執行隊列當中,等待CPU輪回進行執行,獲取執行權。
線程的感冒--凍結狀態
線程被調用了sleep方法或者調用了wait方法之后,放棄了CPU的執行權。但是凍結之后也可以再次回到運行狀態,重新獲取CPU的執行權。當然也可以在中斷或出現異常的時候直接到死亡狀態。
線程的落幕—死亡狀態
如果線程出現了致命的異常或者線程的執行邏輯完畢,這就意味着線程要謝幕say byebye了。死亡后的線程不能再次回到任何一個狀態。
總結
一個進程至少有一個線程在運行
Main函數本身就是一個線程,我們稱之為主線程
實現多線程的方式是可以繼承Thread類,也可以實現Runnable接口
沒有嚴格意義上的並發
JVM自身有很多后台線程在運行,支撐着我們的程序
初始化狀態只能到運行狀態
運行狀態能到凍結狀態和死亡狀態
凍結狀態能到運行狀態和死亡狀態
死亡狀態只能接受死亡的事實