两种创建线程的方法
- 继承Thread类,重写run()方法
启动线程:子类对象.start()
不建议使用:避免OOP单继承局限性 - 实现Runnable接口
启动线程:传入目标对象+Thread对象.start()
推荐使用:避免单继承局限性,灵活方便,方便同一对象被多个线程使用
龟兔赛跑(案例)
public class Race implements Runnable{
private static String winner;
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
boolean flag = gameOver(i);
if(flag){
break;
}
try {
Thread.sleep(100); //休眠可以使得我们在控制台更直观地看到打印出来的信息
} catch (InterruptedException e) {
e.printStackTrace();
}
if(Thread.currentThread().getName().equals("兔子")){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "跑了" + i + "步");
}
}
private boolean gameOver(int steps){
if(winner!=null) {
return true; //如果已经有胜利者则比赛结束
} else if(steps==100){
winner = Thread.currentThread().getName(); //第一个到100步的为获胜者
System.out.println("Winner is:" + Thread.currentThread().getName());
return true;
}else {
return false;
}
}
public static void main(String[] args) {
Race race = new Race();
new Thread(race,"兔子").start();
new Thread(race,"乌龟").start();
}
}
本质上是操作同一个对象当中的静态属性winner