摘 要:多線程編程是Java語言的一個很重要的特點,它是面向對象程序設計的關鍵技術之一。本文簡要的探討了Java語言多線程的基本技術,就線程的創建、線程控制和調度及線程同步等處理技術做了相關探討。
關鍵詞:多線程 創建 控制 同步 應用
中圖分類號:G633.3文獻標識碼:A文章編號:1674-098X(2011)04(b)-0022-01
多線程程序是Java語言的一個很重要的特點,在一個Java程序中,可以同時并行運行多個相對獨立的線程。線程是一段完成某個特定功能的語句體,一個線程是一個程序內部單個順序的控制流。多線程是指同一個應用程序中,有多個順序流同時執行,即多線程表示一個程序內部可以同時執行多個線程。多線程的程序能更好地表述和解決現實世界的問題,是計算機應用開發和設計過程的一個必然發展趨勢。
1 線程的創建
在Java程序設計中,創建線程有兩種方法:一個方法是從一個自定義的類(如Mythread)中創建,即讓程序繼承Thread類。例如:Thread t=new Mythread();這個類擴展了Java基礎類庫中的Thread類及其方法。Mythread類中必須替換Thread類中的run()方法。應注意的是,初始化Mythread為類,并不能使對象t作為一個線程開始執行,而必須獨立運行的子語句體放到run()方法(是Thread類中的一個方法)中。再調用線程的star()方法來開始線程的執行,進而依順序調用run()方法。這種創建線程的方法有一個缺陷,即必須擴展Thread類。由于Java是單一繼承,不支持多重繼承,所以不能寫一個多線程的Applet。因為如果寫多線程的Applet的話,就要擴展Applet和Thread類,而這在Java中是不允許的。
由于這個原因,Java給出了另一個創建線程的方法。另一種方法是使用接口。在Java中,用于創建線程的接口是Runable,其過程分為三個步驟:(1)聲明一個實現Runnable接口;(2)生成一個Thread類的對象;(3)將生成的Runnable對象作為參數傳遞給Thread構造方法。當線程開始執行時,它將調用執行Runable接口的相應的run()方法。
2 線程的狀態
在Java語言中,一個完整的線程周期通常有以下5個狀態組成。
2.1 新建狀態
新建狀態是指一個Thread類或者子類被聲明并創建后的狀態。新建線程具有相應的內存空間和其他資源,并且已初始化。
2.2 就緒狀態
處于新建狀態的線程被啟動后,將進入線程隊列等待CPU時間片,此時它已具備了運行的條件。一旦它來享用CPU的資源時,就脫離創建它的主線程獨立開始自己的運行周期。此外,原來處于阻塞狀態的線程被解除阻塞后也將進入就緒狀態。
2.3 運行狀態
當就緒狀態的線程被調度并獲得CPU資源時,進入運行狀態。當線程對象被執行時,它自動調用該對象的run()方法,從第一條語句順序執行。
2.4 阻塞狀態
一個正在被執行的線程在某些特殊情況下(例如,被人為掛起或需要執行輸入或者輸出操作),讓出CPU并暫時終止自己的執行周期,則進入阻塞狀態。阻塞時,它不能進入排隊隊列。只有阻塞的原因被取消,線程才可以轉入就緒狀態。
3 線程的優先級
Java提供了一個線程調度器來監控程序啟動后進入就緒狀態的所有線程。線程調度器按照線程的優先級決定調度哪個線程來執行。線程調度器是搶先式調度,也就是說在當前線程執行過程中,一個更高優先級的線程進入可運行狀態,則這個線程立即被調度執行。Java中線程的優先級從高到低的范圍為1~10,Thread類定義了3個常量,用于選擇常用的優先級:MINPRIORITY(其值為1),NORM-PRIORITY(其值為5,默認值)MAX-PRIORITY(其值為10)。當一個線程剛產生時,繼承該線程的優先級,通常為5,即NORM-PRIORITY,使用getPriority(),可以得到一個線程的優先級;通過調用setPriority()方法,可以更改一個線程的優先級。Setpriority()方法必須帶有一個大于0、小于等于10的整型參數。如果該參數小于1、大于10,則運行時拋出IlegalArgumentExcep-tion。
4 Java多線程技術在手機聯網中的應用
MIDlet是一種java程序的執行機制,手機中所有的MIDlet程序都是由Application Manager Software(AMS,應用程序管理軟件)管理的。當MIDlet初始化后,AMS就會調用MIDlet的startApp()方法,此時MIDlet就進入了Acitiv狀態。在JAVA ME中有些操作可能會導致程序堵塞,比如連接網絡等。如果這些操作與主程序在同一個主線程中完成,那么由于堵塞會造成程序長時間無法返回,也就無法響應用戶的其他操作了。所以,如果我們在commandAction()中進行了聯網的操作,則會造成如上所述的情況。
例如下面一個“Echo Message”實例,手機端向服務器端發送一條消息,服務器得到此消息后直接返回給手機端。首先,創建一個NetworkConnection類來封裝聯網相關的操作,這樣,MIDlet中只需調用此類中的方法就可以完成聯網的操作。接著,我們寫一個MalConnectionMidlet類,它繼承了MIDlet,在commandAction()方法中直接調用NetworkConnection中的方法,而沒有重新創建一個線程。當用戶按下“問候”命令時,就會向服務器發送“Hello World”的消息,然后再得到服務器返回的消息,并顯示在TextBox中。運行程序。當用戶按下“問候”命令后,程序就僵死了,并在Console窗口中得到如下警告。這就是因為沒有使用多線程造成的。就來看看如何使用多線程來解決此問題。新建類Network-Thread,它繼承在Thread,并將原先commandAction()中發送、接收消息的操作移到此類中完成。此時,在commandAction()中,我們創建了新的線程來完成消息的發送和接收。運行程序,可以成功接受到返回的消息,同樣,在移動多媒體的使用過程中也需要應用到多線程。利用手機攝像頭拍照的操作也會引起的堵塞,多線程能很好的解決這些問題。
5 結語
在引入Java多線程技術后,首先,程序能夠同時執行多個任務,處理不同事件的多線程機制中,不同的線程處理不同的任務,他們之間互不干涉。不會由于一處等待而影響其他部分。其次,它們提供了一個充分利用計算機CPU的方法;再次,它能夠提高應用程序的使用率,加快應用程序的響應時間,以及使應用程序更有效地利用系統資源。另外多線程技術不僅用于實時控制編程,它在網絡通迅、數學計算和多媒體編程等方面也有著很廣闊的應用前景。
參考文獻
[1]陽小蘭.Java語言中多線程技術的研究與實現[J].軟件導刊,2007.
[2]李卓玲.Java程序設計實用教程[J].大連:大連理工大學出版社,2003.