線程與進程的區別 1.線程與進程 每個正在系統上運行的程式都是一個進程。每個進程包含一到多個線程。線程是一組指令的集合,或者是程式的特殊段,它可以在程式里獨立執行。也可以把它理解為代碼運行的上下文。所以線程基本上是輕量級的進程,它負責在單個程式里執行多任務。通常由操作系統負責多個線程的調度和執行。使 ...
線程與進程的區別
1.線程與進程
每個正在系統上運行的程式都是一個進程。每個進程包含一到多個線程。線程是一組指令的集合,或者是程式的特殊段,它可以在程式里獨立執行。也可以把它理解為代碼運行的上下文。所以線程基本上是輕量級的進程,它負責在單個程式里執行多任務。通常由操作系統負責多個線程的調度和執行。使用線程可以把占據時間長的程式中的任務放到後臺去處理,程式的運行速度可能加快,在一些等待的任務實現上如用戶輸入、文件讀寫和網路收發數據等,線程就比較有用了。在這種情況下可以釋放一些珍貴的資源如記憶體占用等等。如果有大量的線程,會影響性能,因為操作系統需要在它們之間切換,更多的線程需要更多的記憶體空間,線程的中止需要考慮其對程式運行的影響。通常塊模型數據是在多個線程間共用的,需要防止線程死鎖情況的發生。
總結:進程是所有線程的集合,每一個線程是進程中的一條執行路徑
2.為什麼要使用多線程
思考一個問題:
愚公門前有一座大山,如果愚公要移走的話這座大山大概需要200年,可以愚公活不到這麼久,那麼有什麼辦法可以在愚公有生之年移走這座大山?
解決方法:
愚公叫自己的子子孫孫一起搬就可以在有生之年搬走這座大山,多線程就是為了提高效率的
總結:多線程可以是程式的效率提高
3.多線程的應用場景
主要體現在多線程提高程式效率。
如:迅雷多線下載,伺服器編程時,壓力測試時等
4.多線程的創建方式
1.繼承Thread類,實現run方法
//繼承Thread public class MyThread extends Thread{ //重寫run()方法 public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+":"+i); } public class Test { public static void main(String[] args) { MyThread thread=new MyThread(); thread.start();//啟動線程
2.實現Runnable介面,重寫run方法
//實現Runnable介面 public class MyRunnable implements Runnable{ //重寫run方法 public void run() { for(int i=1;i<10;i++) { System.out.println(Thread.currentThread().getName()+":"+i); } public class Test { public static void main(String[] args) { MyRunnable myRunnable=new MyRunnable(); Thread myThread=new Thread (myRunnable); myThread.start();
5.多線程的運行狀態
線程從創建、運行到結束總是處於下麵五個狀態之一:新建狀態、就緒狀態、運行狀態、阻塞狀態及死亡狀態。
1.新建狀態
當用new操作符創建一個線程時, 例如new Thread(r),線程還沒有開始運行,此時線程處在新建狀態。 當一個線程處於新生狀態時,程式還沒有開始運行線程中的代碼
2.就緒模式
一個新創建的線程並不自動開始運行,要執行線程,必須調用線程的start()方法。當線程對象調用start()方法即啟動了線程,start()方法創建線程運行的系統資源,並調度線程運行run()方法。當start()方法返回後,線程就處於就緒狀態。處於就緒狀態的線程並不一定立即運行run()方法,線程還必須同其他線程競爭CPU時間,只有獲得CPU時間才可以運行線程。因為在單CPU的電腦系統中,不可能同時運行多個線程,一個時刻僅有一個線程處於運行狀態。因此此時可能有多個線程處於就緒狀態。對多個處於就緒狀態的線程是由Java運行時系統的線程調度程式(thread scheduler)來調度的。
3.運行模式
當線程獲得CPU時間後,它才進入運行狀態,真正開始執行run()方法.
4.阻塞模式
線程運行過程中,可能由於各種原因進入阻塞狀態:
1>線程通過調用sleep方法進入睡眠狀態;
2>線程調用一個在I/O上被阻塞的操作,即該操作在輸入輸出操作完成之前不會返回到它的調用者;
3>線程試圖得到一個鎖,而該鎖正被其他線程持有;
4>線程在等待某個觸發條件;
5.死亡模式
有兩個原因會導致線程死亡:
(1) run方法正常退出而自然死亡,
(2)一個未捕獲的異常終止了run方法而使線程猝死。
為了確定線程在當前是否存活著(就是要麼是可運行的,要麼是被阻塞了),需要使用isAlive方法。如果是可運行或被阻塞,這個方法返回true; 如果線程仍舊是new狀態且不是可運行的, 或者線程死亡了,則返回false.