java游戏编程(1)线程

 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事件派生线程处理用户输入事件,如鼠标单击,键击和窗口缩放等。下面列举一些需要使用线程的情形:从本地文件系统中装入大量文件

进行任何网络通信时,如将高分成绩发送到服务器中;进行任何海量计算时,如生成地形。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值