一.線程和進程的簡介
關於進程和線程的簡介可以參見:
http://blog.csdn.net/feng131719/archive/2009/06/05/4244286.aspx
二.線程的實現形式
多線程有兩種實現形式,通過定時執行也可以達到多線程的目的。下面就每一種實現做一下簡單介紹:
1.繼承Thread類(java.lang.Thread)
建立一個繼承自Thread 類子類。但是必須覆蓋Thread 的 run() 函數來完成有用的工作。使用時並不直接調用此函數;而是必須調用 Thread 的 start() 函數,該函數再調用 run()。
例如:
class PrimeThread extends Thread {
long minPrime;
PrimeThread(long minPrime) {
this.minPrime = minPrime;
}
public void run() {
// compute primes larger than minPrime
. . .
}
}
然後,下列代碼會建立並啟動一個線程:
PrimeThread p = new PrimeThread(143); p.start();
當執行start方法時候,將會自動運行run方法,但是執行start方法時候只做了一件事,
就是將線程轉化為可執行狀態,然後等待作業系統進行調度並運行,因此無法保證線程能立即啟動。
在JAVA中,Thread類實現了Runnable介面,因此run方法是通過實現介面Runnable中的抽象方法。
二、直接實現Runnable多線程介面(java.lang.Runnable)
線程介面Runnable中只有一個抽象方法run,通過實現Runnable介面中的方法的類即可建立出
有多線程特徵的對象,但該對象並無法使其啟動線程,需要作為參數並藉助Thread的
構造方法構造建立對象並調用start方法對線程進行啟動。
class PrimeRun implements Runnable { long minPrime; PrimeRun(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } }
然後,下列代碼會建立並啟動一個線程:
PrimeRun p = new PrimeRun(143); new Thread(p).start();
三、使用工作群組合實現多線程
在J2ME中,同樣具有JAVA中的任務處理組合類別,他們分別為Timer和TimerTask,可以使用他們實現多線程,簡單說就是定時實現任務。
Timer是JAVA中的一個定時器,可以實現在某一時間做某件事或者在某一時間段做某些事,分別通過方法schedule(TimerTask tt,long millis)和schedule(TimerTask tt,long start,long off)。
TimerTask是一個任務類,通過繼承該類並覆蓋方法run即可建立一個任務。
如:public class TimerTaskS extends TimerTask{ public TimerTaskS(){ //constructor } public void run(){ //run code entity } } |
任務調用:
Timer timer = new Timer();
//3秒鐘後執行任務
timer.schedule(new TimerTaskS(),3000);
//3秒鐘後執行任務並且之後每5秒鐘執行一次
timer.schedule(new TimerTaskS(),3000,5000);
有此可見在使用計時任務可以達到實現線程的效果,分別執行不同的並行作業,通過Timer類對象來操作TimerTask對象,通過schedule方法來計時執行任務,在結束任務的時候,通常使用cancel()來實現。
通常情況下,在J2ME軟體中我們通過手機按鍵來觸發一系列相應的操作,在程式響應處理過程中較多會涉及網路操作、資料存放區等相對消耗時間和資源的操作,而這些操作往往需要一定的時間才能完成,因此在處理按鍵響應過程中通常我們需要建立線程處理,避免程式出現死機現象。
public void commandAction(Command c, Displayable s) { if(c==do1Com){ //建立實現介面線程 new Thread(new RunnableSimple()).start(); } else if(c==do2Com){ //建立繼承Thread線程 new ThreadSimple().start(); } else{ //建立任務線程 new Timer().schedule(new TimerTaskS(),3000,20); } } |