J2me多執行緒(入門級別)

javaprogramers發表於2005-03-29

    

       執行緒也稱為輕型程式 (LWP)。因為執行緒只能在單個程式的作用域內活動,所以建立執行緒比建立程式要廉價

得多。這樣,因為執行緒允許協作和資料交換,並 且在計算資源方面非常廉價,所以執行緒比程式更可取。執行緒需

作業系統的支援,因此不是所有的機器都提供執行緒。Java 程式語言,作為相當新的一種語言, 已將執行緒支

與語言本身合為一體,而作為java的微小版本的J2ME同樣對執行緒提供了強健的支援。 在java語言程式設計中,

使用執行緒的方法只有兩種:一是通過繼承Thread類,二是在用到執行緒的類中實現runnable介面。


Thread 類

Thread 類是一個具體的類,即不是抽象類,該類封裝了執行緒的行為。要建立一個執行緒,就必須建立一個繼承自

Thread 類子類。程式設計師必須覆蓋Thread 的 run() 函式來完成有用的工作。使用時並不直接呼叫此函式;而是

必須呼叫 Thread 的 start() 函式,該函式再呼叫 run()。下面的程式碼說明了它的用法:

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class Bounce extends MIDlet {
private BounceCanvas myCanvas;
/**
* 宣告RectThread執行緒類
*/
private RectThread rectThreads[];
private boolean done = false;
private Display myDisplay;
/**
* repaint鎖
*/
private Object repaintLock = new Object();
Bounce() {
myDisplay = Display.getDisplay(this);
myCanvas = new BounceCanvas();
createRectThreads();
}
/*
* 建立四個矩形框
*/
void createRectThreads () {
rectThreads = new RectThread[4];
rectThreads[0] = new RectThread(2, 2, 30, 30, 8, myCanvas);
rectThreads[1] = new RectThread(-2, -2, 40, 40, 4, myCanvas);
rectThreads[2] = new RectThread(-1, -1, 50, 10, 10,myCanvas);
rectThreads[3] = new RectThread(4, 4, 10, 10, 2, myCanvas);
}
/**
* 啟動執行緒
*/
protected void startApp() throws MIDletStateChangeException {
myDisplay.setCurrent(myCanvas);
if (rectThreads == null) {
createRectThreads();
}
for (int i = 0; i < rectThreads.length; i++) {
if (!rectThreads[i].isAlive()) {
rectThreads[i].start();
}
}
}
/**
* 停止執行緒
*/
protected void pauseApp() {
done = true;
if (rectThreads != null) {
for(int i = 0; i < rectThreads.length; i++) {
rectThreads[i].stopThread();
}
rectThreads = null;
}
}
protected void destroyApp(boolean unconditional) {}
class BounceCanvas extends Canvas {
public static final int BACKGROUND_COLOR = 0xFFFFFF;
public static final int FOREGROUND_COLOR = 0x000000;
public void paint(Graphics g) {
synchronized (g) {
g.setColor(BACKGROUND_COLOR);
g.fillRect(0, 0, getWidth(), getHeight());
if (rectThreads != null) {
for (int i = 0; i < rectThreads.length; i++) {
rectThreads[i].paint(g);
}
}
}
}
}

相關文章