摘 要: 多線程技術是JAVA應用的主要技術,多線程具有并行機制、交互性能、實時控制等性能。主要的優勢有提高界面程序響應速度和充分利用系統資源。通過使用線程,可以將需要大量時間完成的流程在后臺完成;而通過在一個程序內部同時執行多個流程,可以充分利用CPU等系統資源,從而最大限度地發揮硬件的性能;在現在的項目開發中,多線程編程技術獲得了廣泛的使用。本文從線程概念、屬性、實現方法、優劣勢來介紹JAVA的多線程技術。
關鍵詞: JAVA 多線程技術 屬性 實現方式 優劣勢
一、JAVA概述
JAVA是一種面象對象的、分布式的、解釋的、鍵壯的、安全的、結構中立的、可移植的、多線程的、動態的的語言。
JAVA的設計思想是建立在當前大多數操作系統都實現了線程調度。JAVA虛擬機的很多任務都依賴線程調度,而且所有的類庫都是為多線程設計的。多線程編程的含義是可將程序任務分成幾個并行的子任務。
二、多線程技術
1.線程概述
一般來說,正在計算機中執行的程序叫做“進程”(Process)。所謂“線程”(Thread),是“進程”中某個單一順序的控制流。
最簡單的Applet也是由多個線程來完成的。在JAVA中,任何一個Applet的paint()和update()方法都是由AWT(Abstract Window Toolkit)繪圖與事件處理線程調用的,而Applet主要的方法:init(),start(),stop()和destory()是由執行該Applet的應用調用的。
Unix操作系統和Microsoft Windows操作系統支持多用戶、多進程的并發執行,而JAVA語言支持應用程序進程內部的多個執行線程的并發執行。
在一個多線程程序中,可以分配一個線程來讀取數據,讓另一個線程來處理數據,而讓第三個線程把數據輸送到圖形卡上去。這三個線程可以并行運行。這樣以來,在磁盤讀取數據的同時仍然可以處理數據,從而提高了整體程序的性能。大量的示例程序都可以被設計來同時做兩件事情以進一步提高性能。JAVA虛擬機(JVM)本身就是基于此原因廣泛使用了多線程技術。例如:一個人在處理家務的過程中,將衣服放到洗衣機中自動洗滌后將大米放在電飯鍋里,然后開始做菜,等菜做好了,飯就煮熟了,同時衣服也洗好了。
2.線程屬性
為了正確有效地使用線程,我們必須理解線程的各個方面,并了解JAVA實時系統,必須知道如何提供線程體、線程的生命周期、實時系統如何調度線程、線程組、什么是幽靈線程。
(1)線程體(Thread Body)
所有的操作都發生在線程體中,在JAVA中線程體是從Thread類繼承的run()方法,或實現Runnable接口的類中的run()方法。當線程產生并初始化后,實時系統調用它的run()方法。run()方法內的代碼實現所產生線程的行為,它是線程的主要部分。
(2)線程狀態
①新線程狀態(New Thread)
產生一個Thread對象就生成一個新線程。當線程處于“新線程”狀態時,僅僅是一個空線程對象,它還沒有分配到系統資源。因此只能啟動或終止它。任何其他操作都會引發異常。
②可運行狀態(Runnable)
start()方法產生運行線程所必須的資源,調度線程執行,并且調用線程的run()方法。在這時線程處于可運行態。該狀態不稱為運行態是因為這時的線程并不總是一直占用處理機。特別是對于只有一個處理機的PC而言,任何時刻只能有一個處于可運行態的線程占用處理機。JAVA通過調度來實現多線程對處理機的共享。
③非運行狀態(Not Runnable)
當以下事件發生時,線程進入非運行態。
suspend()方法被調用;
sleep()方法被調用;
線程使用wait()來等待條件變量;
線程處于I/O等待;
死亡態(Dead):當run()方法返回,或別的線程調用stop()方法,線程進入死亡態。
(3)線程的調度
線程調度是JVM對運行的多個線程進行系統級的協調,以避免多個線程爭用有限資源而導致應用系統死機或者崩潰。
JAVA定義了線程的優先級策略。JAVA將線程的優先級分為10個等級,分別用1-10之間的數字表示。數字越大表明線程的級別越高。
為了控制線程的運行策略,JAVA定義了線程調度器來監控系統中處于就緒狀態的所有線程。線程調度器按照線程的優先級決定那個線程投入處理器運行。在多個線程處于就緒狀態的條件下,具有高優先級的線程會在低優先級線程之前得到執行。線程調度器同樣采用“搶占式”策略來調度線程執行,即當前線程執行過程中有較高優先級的線程進入就緒狀態,則高優先級的線程立即被調度執行。具有相同優先級的所有線程采用輪轉的方式來共同分配CPU時間片。
(4)幽靈線程(Demon Thread)
任何一個JAVA線程都能成為幽靈線程。它是作為運行于同一個進程內的對象和線程的服務提供者。幽靈線程是應用中典型的獨立線程。它為同一應用中的其他對象和線程提供服務。幽靈線程的run()方法一般都是無限循環,等待服務請求。
(5)線程組(Thread Group)
每個JAVA線程都是某個線程組的成員。線程組提供一種機制,使得多個線程集于一個對象內,能對它們實行整體操作。當線程產生時,可以指定線程組或由實時系統將其放入某個缺省的線程組內。線程只能屬于一個線程組,并且當線程產生后不能改變它所屬的線程組。
3.線程的實現
JAVA語言實現多線程應用程序的方法,根據多線程應用程序繼承或實現對象的不同可以采用兩種方式:一種是應用程序的并發運行對象直接繼承java的線程類Thread;另一種方式是定義并發執行對象實現Runnable接口;即:一種是擴展java.lang.Thread類,另一種是通過java.lang.Runnable接口。
(1)繼承Thread類來實現線程:
import.JAVA.awt.*;
public class wxy1
{public static void main(Stringargs)
{thread1 t1=new thread1(1); // 創建線程
thread1 t2=new thread1(2);
t1.start();t2.start();
}
}
class thread1 extends Thread// thread1類繼承了Thread類
{ int d;
Mythread(int i)
{ d=i;}
public void run()
{ int i=0;
while(d+i==1)
{ try {sleep(1000);}
catch(InterruptedException e) {}
}
System.out.println(\"The d is \"+d);
}
(2)以下代碼是實現Runnable接口的實現多線程
import JAVA.applet.Applet;
import JAVA.awt.*;
public class wxy2 extends Applet implements Runnable// wxy2類繼承了Applet實現Runnable
{ static int r=20;
static int x=80;
static int y=20;
Thread th;
public void init()
{th = new Thread(this);
th.start();
}
public void run()
{int y1=+1;
int i=1;
int sleeptime=10;
while(true)
{y+=(i*y);
if(y-rgetSize().height)
y1*=-1;
try{t.sleep(sleeptime);}
catch(InterruptedException e){ }
}}}
4.多線程的優劣勢
多線程帶來的更大的好處是更好的交互性能和實時控制性能。多線程技術使程序的響應速度更快;當前沒有進行處理的任務可以將處理器時間讓給其他任務;占用大量處理時間的任務可以定期將處理器時間讓給其他任務;可以隨時停止任務;可以分別設置各個任務的優先級以優化性能。缺點有:等候使用共享資源時造成程序的運行速度變慢;對線程進行管理要求的額外CPU開銷;漫長的等待、浪費精力的資源競爭,以及死鎖等多線程癥狀。
三、結語
本文講述了Java多線程技術的幾個方面,包括JAVA概述、多線程技術(線程概述、線程屬性、線程實現和多線程的優劣勢)。多線程的核心在于多個代碼塊并發執行,本質特點在于各代碼塊之間的代碼是亂序執行的;多線程技術是JAVA的重要主要技術,Java語言對應用程序多線程能力的支持增強了Java作為網絡程序設計語言的優勢。
參考文獻:
[1]王衛生.Java程序設計與實訓教程[M].北京:北京理工大學出版社,2007:2.
[2]孟鉑,樊新華.Java的多線程應用[J].電腦知識與技術(學術交流),2006,(23).
[3]賈蘭蘭.剖析JAVA語言的多線程[J].信息系統工程,2009,(6).