Board logo

標題: 執行緒 [打印本頁]

作者: tonyh    時間: 2017-10-27 20:06     標題: 執行緒

本帖最後由 tonyh 於 2019-11-23 13:44 編輯

執行緒(Thread)是指單一連續的程式行程,傳統的程式語言大多只有一個執行緒,但是在Java中允許應用程式同時執行兩個或兩個以上的執行緒,稱為多執行緒。

在介紹執行緒之前,我們先了解什麼是行程(Process)。所謂行程是指作業系統執行每個應用程式的流程,作業系統會分配足夠的記憶體空間與CPU時間給每個行程。而因為每個應用程式不一定會佔用CPU的所有時間,為了充分使用CPU時間,避免有CPU閒置的情況,所以衍生出多執行緒的概念。

單一執行緒是指應用程式在一個行程中只能處理一項工作,也就是說同一個時間點只能執行一道指令,必須等前一項工作執行後,才能依序執行下一個工作。



多執行緒是指應用程式在一個行程中可以同時處理多項工作,而每一個行程都是各自獨立的,不會互相干擾。利用多執行緒可以讓應用程式的行程共享CPU記憶體空間與時間,善加利用CPU的閒置時間,有效率的執行程式,而多執行緒其實就是模擬多工功能而發展出來的概念。

多工是在Windows作業系統中常見的特性,舉例來說,作業系統可以同時執行瀏覽器、Word、小畫家等多個應用程式。

多工與多執行緒不同之處在於,多工是指同一個時間執行多個應用程式;而多執行緒是指同一個時間執行同一個應用程式中的多個行程,例如:Word文件可以同時做編輯、翻譯與列印等行程,在傳統的單一執行緒環境裡,必須等待前一個行程執行完畢才可以繼續執行下一個行程,但是在多執行緒環境中,卻可以同時執行這些程式。



舉一個簡單的例子,有間餐廳來了兩桌客人,他們分別點很多道菜。而餐廳只有一個廚師,要分別為這兩桌上菜,並讓他們感覺餐廳一直不停為他們服務。事實上廚師是輪流為他們炒菜,而不是同時炒多道菜。只要炒菜速度夠快,且客人吃飯速度不要太快,客人在吃飯的過程就不會有等待感覺。

但如果廚師速度不夠快,而客人太多,就會有等待的現象發生。解決這個問題就是聘請手腳更靈活的廚師,或增加廚師,甚至找其他餐廳支援。這就如同為電腦更換一顆更快的CPU,或為電腦裝載多核心的CPU,甚至將多台電腦串聯起來以達到更強大的效能。

每個程式都至少會有一個執行緒,Java在主程式類別中的main()方法,就是執行Java程式的入口,寫在這方法內的程式流程,就是主執行緒。

Java提供兩種建立多執行緒的方式,一種是繼承Thread類別,一種是實作Runnable介面。無論使用何種方式,基本的操作原理就是覆寫執行緒類別中的run()方法,以編輯執行緒中的程式流程。

下面介紹幾個多執行緒常用的方法:

1. void run():執行新執行緒
用來撰寫新建立執行緒的程式碼,其宣告變數、呼叫其它方法、使用其它類別…等,用法與main()相同。但main()是主執行緒的流程入口,而run()需要用start()方法來呼叫。

2. void start():啟動新執行緒
用來呼叫run()方法,即新執行緒的流程入口。

3. void sleep(long 毫秒):延遲
使執行緒進入延遲或暫停狀態,延遲的時間以毫秒為單位計數,1000毫秒等於1秒。因使用sleep()方法會拋出一個InterruptedException例外物件,所以sleep()方法必須寫在try區段內。

  1. public class Ch121 {
  2.        
  3.         public static void main(String[] args) {
  4.                 for(int i=5; i>=1; i--)
  5.                 {
  6.                         System.out.println(i+"秒");
  7.                         try {
  8.                                 Thread.sleep(1000);
  9.                         } catch (InterruptedException e) {}
  10.                 }
  11.                 System.out.println("時間到!");
  12.                 System.out.println("執行緒名稱: "+Thread.currentThread().getName());
  13.         }
  14. }
複製代碼

作者: 李知易    時間: 2017-10-27 21:36

  1. public class Ch123 {
  2.         
  3.         public static void main(String[] args)
  4.         {
  5.                     System.out.println("給你5秒鐘走路!!聽到沒有!!");
  6.                 for(int i=5; i>=1; i--)
  7.                 {
  8.                         System.out.println(i+"秒");
  9.                         try {
  10.                                 Thread.sleep(1000);
  11.                         } catch (InterruptedException e) {}
  12.                 }
  13.                 System.out.println("時間到了~還不快滾!");
  14.                 System.out.println("執行緒名稱: "+Thread.currentThread().getName());
  15.         }
  16. }
複製代碼

作者: 洪振庭    時間: 2017-10-28 20:30

  1. public class Ch123 {
  2.         public static void main(String[] args){
  3.                 for(int i=5;i>=1;i--){                       
  4.                         System.out.println(i+"seconds");
  5.                         try{
  6.                                 Thread.sleep(1000);                               
  7.                         }catch(InterruptedException e){}
  8.                 }
  9.                 System.out.println("Time's up!");
  10.                 System.out.println("Thread's name:"+Thread.currentThread().getName());
  11.         
  12.         }
  13. }
複製代碼

作者: 黃璽安    時間: 2017-11-3 19:41

  1. public class Ch121 {
  2.         
  3.         public static void main(String[] args) {
  4.                 for(int i=5; i>=1; i--)
  5.                 {
  6.                         System.out.println(i+"秒");
  7.                         try {
  8.                                 Thread.sleep(1000);
  9.                         } catch (InterruptedException e) {}
  10.                 }
  11.                 System.out.println("時間到!");
  12.                 System.out.println("執行緒名稱: "+Thread.currentThread().getName());
  13.         }
  14. }
複製代碼

作者: 陳思惟    時間: 2017-11-4 10:06

  1. public class Ch121 {
  2.         
  3.         public static void main(String[] args) {
  4.                 for(int i=5; i>=1; i--)
  5.                 {
  6.                         System.out.println(i+"秒");
  7.                         try {
  8.                                 Thread.sleep(1000);
  9.                         } catch (InterruptedException e) {}
  10.                 }
  11.                 System.out.println("時間到!");
  12.                 System.out.println("執行緒名稱: "+Thread.currentThread().getName());
  13.         }
  14. }
複製代碼





歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://seed.istak.org.tw/) Powered by Discuz! 7.2