1.怎样实现Runnable接口实现多线程:
1.创建一个类声明是实现了Runable的接口
2.实现run()方法,编辑执行体
3.创建线程对象,调用start()方法启动线程
2.继承Thread与实现Runnable接口的区别:
继承Thread启动线程:子类对象.start()
实现Runnable启动线程:传入目标对象+Thread对象.start()
3.比起Thread更推荐使用Runnable的原因:
避免了单继承的局限性(Thread只能单继承),灵活方便,方便同一个对象,被多个线程使用
4.发现问题:
多个线程操作同一个资源的情况下线程不安全(解决方法谈到线程同步时再说吧)
5.龟兔赛跑代码示例(多个线程操作同一个对象):
赛道为对象,龟兔为线程
package Thread;
public class Race implements Runnable{
//胜利者 static静态修饰保证他只有一个
private static String winner;
@Override
public void run(){
for(int i = 0;i <= 100;i++){
//模拟兔子休息
if(Thread.currentThread().getName().equals("兔子")&& i%10==0){
try {
Thread.sleep(1);
}catch (InterruptedException e){
e.printStackTrace();
}
}
//判断比赛是否结束
boolean flag = gameOver(i);
//如果尼塞结束了终止程序
if(flag){
break;
}
//Thread.currentThread().getName()获取线程的名字
System.out.println(Thread.currentThread().getName()+"-->跑了"+i+"步");
}
}
//判断是否完成比赛
private boolean gameOver(int steps){
//判断是否存在胜利者
if(winner!=null){
return true;
}{
if(steps==100){
winner = Thread.currentThread().getName();
System.out.println("winner is"+winner);
return true;
}
}
return false;
}
public static void main(String[] args) {
//定义赛道
Race race = new Race();
new Thread(race,"兔子").start();
new Thread(race,"乌龟").start();
}
}