java遊戲編程(1)線程

來源:互聯網
上載者:User

 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事件派生線程處理使用者輸入事件,如按一下滑鼠,鍵擊和視窗縮放等。下面列舉一些需要使用線程的情形:從本地檔案系統中裝入大量檔案

進行任何網路通訊時,如將高分成績發送到伺服器中;進行任何海量計算時,如產生地形。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.