Board logo

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

作者: 周政輝    時間: 2018-5-12 10:53     標題: 執行緒

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

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

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

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

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

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

[attach]4042[/attach]

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

但如果廚師速度不夠快,而客人太多,就會有等待的現象發生。解決這個問題就是聘請手腳更靈活的廚師,或增加廚師,甚至找其他餐廳支援。這就如同為電腦更換一顆更快的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區段內。

[attach]4043[/attach]
作者: 陳泓瑜    時間: 2018-5-12 11:32

  1. package tw.kuas.edu.tw;

  2. public class Main {

  3.         public static void main(String[] args) throws InterruptedException {
  4.                 // TODO 自動產生的方法 Stub
  5.                 for(int i=100; i>=0; i--)
  6.                 {
  7.                         Thread.sleep(1000);
  8.                         System.out.println(i+"s!");
  9.                 }       
  10.                 System.out.println("Time's up!");

  11.         }

  12. }
複製代碼

作者: 林侑成    時間: 2018-5-12 11:36

  1. package qwer;

  2. public class Qwer {

  3.         public static void main(String[] args) throws InterruptedException
  4.         {
  5.                 for(int i=5; i>=1; i--)
  6.                 {
  7.                         Thread.sleep(1000);
  8.                         System.out.print(i+"秒");               
  9.                 }
  10.                 System.out.print("Time");
  11.         }
  12. }
複製代碼

作者: 黃茂勛    時間: 2018-5-23 17:28

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

作者: 張健勳    時間: 2018-5-25 19:06

  1. package bbs.istak.org.tw;

  2. public class Main {

  3.         public static void main(String[] args) {
  4.                 // TODO 自動產生的方法 Stub
  5.                
  6.                 for( int i=5; i>=1; i--)
  7.                 {
  8.                         try {
  9.                                 Thread.sleep(1000);
  10.                         } catch (InterruptedException e) {
  11.                                 // TODO 自動產生的 catch 區塊
  12.                                 e.printStackTrace();
  13.                         }
  14.                         System.out.println(i+"秒");
  15.                 }
  16.                 System.out.println("Time Out!!!");
  17.                 System.out.println("執行緒名稱:"+Thread.currentThread().getName());

  18.         }

  19. }
複製代碼





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