標題:
執行緒
[打印本頁]
作者:
tonyh
時間:
2016-10-1 16:03
標題:
執行緒
本帖最後由 tonyh 於 2017-10-27 20:05 編輯
執行緒(Thread)是指單一連續的程式行程,傳統的程式語言大多只有一個執行緒,但是在Java中允許應用程式同時執行兩個或兩個以上的執行緒,稱為多執行緒。
在介紹執行緒之前,我們先了解什麼是行程(Process)。所謂行程是指作業系統執行每個應用程式的流程,作業系統會分配足夠的記憶體空間與CPU時間給每個行程。而因為每個應用程式不一定會佔用CPU的所有時間,為了充分使用CPU時間,避免有CPU閒置的情況,所以衍生出多執行緒的概念。
單一執行緒是指應用程式在一個行程中只能處理一項工作,也就是說同一個時間點只能執行一道指令,必須等前一項工作執行後,才能依序執行下一個工作。
[attach]1769[/attach]
多執行緒是指應用程式在一個行程中可以同時處理多項工作,而每一個行程都是各自獨立的,不會互相干擾。利用多執行緒可以讓應用程式的行程共享CPU記憶體空間與時間,善加利用CPU的閒置時間,有效率的執行程式,而多執行緒其實就是模擬多工功能而發展出來的概念。
多工是在Windows作業系統中常見的特性,舉例來說,作業系統可以同時執行瀏覽器、Word、小畫家等多個應用程式。
多工與多執行緒不同之處在於,多工是指同一個時間執行多個應用程式;而多執行緒是指同一個時間執行同一個應用程式中的多個行程,例如:Word文件可以同時做編輯、翻譯與列印等行程,在傳統的單一執行緒環境裡,必須等待前一個行程執行完畢才可以繼續執行下一個行程,但是在多執行緒環境中,卻可以同時執行這些程式。
[attach]1770[/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]1783[/attach]
public class Ch121 {
public static void main(String[] args) {
for(int i=5; i>=1; i--)
{
System.out.println(i+"秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
}
System.out.println("時間到!");
System.out.println("執行緒名稱: "+Thread.currentThread().getName());
}
}
複製代碼
作者:
劉得恩
時間:
2016-10-1 16:53
public class Ch121
{
public static void main(String args[])
{
for(int i=5;i>=1;i--)
{
System.out.println(i+"秒");
try {
Thread.sleep(1000);
} catch (Exception e) { }
}
System.out.println("時間到");
System.out.println("執行緒名稱:"+Thread.currentThread().getName());
}
}
複製代碼
作者:
張峻瑋
時間:
2016-10-1 16:54
public class Ch121 {
public static void main(String[] args) {
for(int i=5;i>=1;i--)
{
System.out.println(i+"秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
}
System.out.println("時間到");
System.out.println("執行緒名稱:"+Thread.currentThread().getName());
}
}
複製代碼
作者:
林宇翔
時間:
2016-10-1 16:56
public class Ch121
{
public static void main(String[] args){
for(int i=5;i>=1;i--)
{
System.out.println(i+"秒");
try{
Thread.sleep(1000);
} catch(InterruptedException e) {}
}
System.out.println("時間到");
System.out.println("執行緒名稱: "+Thread.currentThread().getName());
}
}
複製代碼
作者:
張彥承
時間:
2016-10-1 16:57
public class Ch100 {
public static void main(String[] args) {
for(int i=5;i>=1;i--)
{
System.out.println(i+"秒");
try{
Thread.sleep(1000);
}catch(InterruptedException e) {}
}
System.out.println("時間到");
System.out.println("執行緒名稱:"+Thread.currentThread().getName());
}
}
複製代碼
作者:
李允軒
時間:
2016-10-1 16:57
public class Ch01 {
public static void main(String[] args) {
for(int i=5; i>=1; i--){
System.out.println(i+"秒");
try{
Thread.sleep(1000);
}catch(InterruptedException e){}
}
System.out.println("時間到");
System.out.println("執行緒名稱: "+ Thread.currentThread().getName());
}
}
複製代碼
歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://seed.istak.org.tw/)
Powered by Discuz! 7.2