1.在java中只要產生線程並啟動即可。實現代碼如下:
Thread myThread=new Thread();
myThread.start();
當產生線程後就要調用Thread的 run()方法。但其實它什麼也不幹,如果想讓run()方法幹點事,有三種基本方法。
(1)擴充Thread類
對線程指定任務的第一個方法就是擴充Thread類,覆蓋其中的run()方法。
例子:public class myThread extends Thread{
public void run(){
{ System.out.println("Do something cool here");
}
}
myThread thread=new myThread();
thread.start();
(2)實現Runnable介面
擴充Thread類很簡單但是不會為了啟動線程而寫一個新類的,必定實作類別擴充也需要運行一個線程來操作。下面是實現Runnable()介面來對線程指定任務。實現代碼如下:
public class MyClass extends SomeOtherClass implements Runnable{
public MyClass(){
Thread thread=new Thread(this);
Thread.start();
}
public void run(){
System.out.println("Do something cool here");
}
}
代碼中MyClass的建構函式啟動一個新線程,而Thread類的建構函式會引用一個Runnable對象作為參數,這個
Runnable對象就是啟動線程執行的任務。
(3)使用匿名內類
假如不能產生新類或不便實現Runnable介面,那麼就可以使用匿名內類來對線程指定任務,實現代碼如下:
new Thread(){
public void run(){
System.out.println("Do something cool here");
}
}.start();
2.等待線程完成
若讓當前線程去等待另一個線程,則可以使用join()方法,實現如下:
myThread.join();
join()方法應用於玩家離開遊戲時,它可以保證在遊戲中所有的線程運行完後,再進行最後清理工作。
線程休眠:Thread.sleep(1000);
3.線程同步
通過關鍵字synchronized來實現同步問題。實現方法進行同步,則一次只能運行一個方法。
例子:
public class Maze{
private int playerX;
private int playerY;
public synchronized boolean isAtExit(){
return(playerX==0&&playerY==0);
}
public synchronized void setPositon(int x,int y){
playerX=x;
playerY=y;
}
}
除了將方法同步之外,還具有將對象同步。例如以上代碼可以如下:
public synchronized class Maze{
private int playerX;
private int playerY;
public void boolean isAtExit(){
isAtExit(this){
return (playerX==0 &&playerY==0);
}
}
public void setPosition(int x,int y){
setPosition(this){
playerX=x;
playerY=y;
}
}
4.使用wait()與notify()
假設兩個線程需要互動交流資訊,設線程A 等待線程B發一個訊息,實現代碼如下:
//Thread A
public void waitForMessage(){
while(hasMessage==false){
Thread.sleep(100);
}
}
//Thread B
public void setMessage(String message){
.......
hasMessage=true;
}
雖然方案可行,但是非常苯,因為線程A每100毫秒就要檢查線程B是否發送訊息。若線程A睡過頭,將可能太遲得到訊息。另外幾個線程等一個訊息呢?
更好的方法是線程A保持閑機,線上程B發訊息時通知線程A。wait()和notify()方法提供了這個功能。
下面是線程A等待線程B發送一個訊息的代碼;
//Thread A
public synchronized void waitForMessage(){
try{ wait();
}
catch(InterruptedException ex){}
}
//Thread B
public synchronized void setMessage(string message){
......
notify();
}
可以看出,線程B調用notify()方法並離開同步方法後(釋放this鎖)。線程A取得鎖並完成同步代碼快。
如果線程一直未收到通知,則等於讓線程休息指定時間量,但是無法判斷線程是逾時返回還是收到了通知。另一個方法notify(),它通知等待同一鎖的所有線程。
java的線程:所有圖形應用程式都有至少兩個運行代碼的線程,主線程和AWT事件派生線程。
主線程就是程式的"主"線程,他用程式主類的main()方法開始執行。AWT事件派生線程處理使用者輸入事件,如按一下滑鼠,鍵擊和視窗縮放等。下面列舉一些需要使用線程的情形:從本地檔案系統中裝入大量檔案
進行任何網路通訊時,如將高分成績發送到伺服器中;進行任何海量計算時,如產生地形。