线程的创建方式:2.实现Runnable接口
实现Runnable
- 定义MyRunnable实现Runnable接口
- 实现run方法,编写线程执行体
- 创建线程对象,调用start()方法启动线程
代码实现
package test;
//创建线程方式2:实现runnable接口,重写run方法,执行线程需要丢入runnable接口实现类,调用start方法
public class ThreadDemo2 implements Runnable {
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 20; i++) {
System.out.println("测试run方法" + i);
}
}
public static void main(String[] args) {
//创建runnable接口的实现类对象
ThreadDemo2 threadDemo2 = new ThreadDemo2();
//创建线程对象,通过线程对象来开启我们的线程,代理
new Thread(threadDemo2).start();
for (int i = 0; i < 200; i++) {
System.out.println("主线程执行。。。" + i);
}
}
}
实现Runnable类和继承Thread的区别:
java可以多实现,但是只能单继承。所以实现Runnable对类的影响不大,继承了Thread后就不能在继承其他类。 其实Runnable接口的出现就是解决继承一个类后,还需要继承Thread实现多线程,但是java不支持多继承,由此使用接口进行扩展。 所以基本使用实现Runnable接口创建线程
- 子类继承Thread类具备多线程能力
- 启动线程:子类对象.start()
- 不建议使用:避免OOP单继承局限性
oop 是面向对象编程,面向对象编程是一种计算机编程架构,OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组、合而成。
- 实现接口Runnable具有多线程能力
- 启动线程:传入目标对象+Thread对象.start()
- 推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
龟兔赛跑案例
实现代码:
package test;
//模拟龟兔赛跑
public class Race implements Runnable {
//胜利者
private static String winner;
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
//模拟兔子休息
if ("兔子".equals(Thread.currentThread().getName()) && i % 10 == 0) {
try {
System.out.println("兔子开始睡10毫秒");
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//判断比赛是否结束
boolean flag = gameOver(i);
//如果比赛结束,就停止程序
if (false) {
break;
}
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();
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();
}
}