java執行緒程式設計(一):執行緒基礎(轉)

ba發表於2007-08-15
java執行緒程式設計(一):執行緒基礎(轉)[@more@]在學習java中,我發現有關於對執行緒的講解比較少,我打算為一些java初學者提一些關於執行緒方面的參考,
為深入學習java奠定基礎。我本著共同進步的原則特寫下了關於java執行緒程式設計的一系列文章

java執行緒程式設計(一):執行緒基礎

◆執行緒(thread)其實是控制執行緒(thread of control)的縮寫.
每一個執行緒都是獨立的,因此執行緒中的每個方法的區域性變數都是和其他執行緒隔離開的,這些變數完全是私有的,因此對於
執行緒而言,是沒有辦法訪問其他執行緒的區域性變數的。如果兩個執行緒同時訪問同一個方法,則每個執行緒得到一個單獨的此方法的
區域性變數的複製。

◆透過Thread類建立執行緒

public classs test{
public void run(){
for (int i;i<100;i++){
System.out.println("hello_"+i);
}
}
}

將會輸出hello_0,一直到hello_99;
如果我們在Applet中呼叫這個方法,他就會在Applet的執行緒中執行。
impot java.applet.Applet;

public class test extends Applet{
public void init(){
test tt=new test();
tt.run();
}
}


如果我們想讓test的run()方法與applet的init()一起執行,該怎麼做呢?
應該使test成為thread(java.lang.Thread)的子類.
程式修改為:
public classs test extends Thread{
public void run(){
for (int i;i<100;i++){
System.out.println("hello_"+i);
}
}
}
接下來我們還要修改Applet:
impot java.applet.Applet;

public class test extends Applet{
public void init(){
test tt=new test();
tt.start();

}
}
對ran()方法的呼叫變成了對start()方法的呼叫。

對此我們做一些說明:
Thread
建立一個程式化的物件
void run()
新建立的執行緒會執行這個方法
void start()
建立一個新的執行緒並執行這個執行緒類中定義的run()方法。

下面我們來看一個例子

import java.awt.*;

public class TimerThread extends Thread{
Componet comp;//需要重畫的元件
int timediff;//元件重畫的間隔時間
volatile boolean shouldrun;//設為false為停止執行緒


public TimerThread (Compond comp,int timediff){
this.comp = comp;
this.timediff = timedifff;
shouldrun = true;
}


public void run(){
while(shouldrun){
try{
comp.repaint();
sleep(timediff);
}catch(Exception e){}

}

}
}
sleep()方法是Thread類的一部分,他使得當前執行緒停止一定的時間。
static void sleep(long millseconds)
睡眠時間指定為毫秒
static void sleep(long millseconds ,int nanoseconds)
睡眠時間指定為毫秒和納秒這個方法是靜態的。


執行緒的停止,一般不推薦使用
stop()方法,使用stop()方法是危險的,將會導致異常。



◆使用Runable介面的執行緒
java語言使用一種稱為介面的機制,來解決其不支援的多重繼承。
Runnable介面只使用一個方法run()方法.

public classs test implements Runnable{
public void run(){
for (int i;i<100;i++){
System.out.println("hello_"+i);
}
}
}

同時相應的程式修改為:
impot java.applet.Applet;

public class test extends Applet{
public void init(){
Runnable tt=new test();
Thread th= new Thread(tt);
th.start()´

}
}

◆執行緒週期

boolean isAlive()
用來判斷一個執行緒是不是活動的
執行緒啟動並不意味著執行緒正在執行或可以執行了,這是這個原因
isAlive()才經常被用來檢測執行緒是否正在執行。


簡單的一段小程式

...
while(timer.isAlive())
{
try{
Thread.sleep(100);
}catch(InterruptedException e){}
}

void jion()
等待指定的執行緒執行結束
當執行緒不活動時,jion()才會返回

void jion(long timeout)
等待指定的執行緒執行結束,但不超過指定的超時值

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-958341/,如需轉載,請註明出處,否則將追究法律責任。

相關文章