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事件派生线程处理用户输入事件,如鼠标单击,键击和窗口缩放等。下面列举一些需要使用线程的情形:从本地文件系统中装入大量文件
进行任何网络通信时,如将高分成绩发送到服务器中;进行任何海量计算时,如生成地形。