实现Runnable 查看JDK帮助文档

  • 定义MyRunnable类实现Runnable接口
  • 实现run()方法,编写线程执行体
  • 创建线程对象,调用start()方法启动线程
  • 推荐使用Runnable对象,因为Java单继承的局限性
package com.xiao.demo01;

//创建线程方式2:实现runnable接口,重写run方法,执行线程需要丢入runnable接口实现类。调用start方法。
public class TestThread3 implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 200; i++) {
            System.out.println("我在看佐匹克---"+i);

        }

    }

    public static void main(String[] args) {
        //创建runnbale接口的实现类对象
        TestThread3 testThread3 = new TestThread3();
        //创建线程对象,通过线程对象来开户我们的线程,代理
        //Thread thread = new Thread();

        //thread.start();

        new Thread(testThread3).start();
        for (int i = 0; i < 1000; i++) {
            System.out.println("我在学习多张程--"+i);

        }
    }
}

小结

  • 继承Thread类
  • 子类继承Thread类具备多线程能力
  • 启动线程:子类对象.start()
  • 不建议使用:避免OOP单继承局限性
  • 实现Runnable接口
  • 实现接口Runnable具有多线程能力
  • 启动线程:传入目标对象+Thread对象.start()
  • 推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
package com.xiao.demo01;

//多个线程同时操作同一个对象
//买火车票
//发现问题:多个线程操作同一个资源的情况下,线程不安全,数据紊乱
public class TestThread4 implements  Runnable{

    //票数
    private  int ticketNums = 10;
    @Override
    public void run() {
        while (true){
            if (ticketNums<+0){
                break;
            }
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "-->拿到了第"+ticketNums--+"票");
        }


    }

    public static void main(String[] args) {
        TestThread4 ticket = new TestThread4();

        new Thread(ticket,"小明").start();
        new Thread(ticket,"赵秋瑞").start();
        new Thread(ticket,"内鬼").start();
    }
}

继承Thread类和实现Runnable接口的区别

分别用Thread、Runnable、Callable实现线程

龟兔赛跑

  • 首先来个赛道距离,然后要离终点越来越近
  • 判断比赛是否结束
  • 打印出胜利都
  • 龟兔赛跑开始
  • 故事中是乌龟赢的,兔子需要睡觉,所以我们来模拟兔子睡觉
  • 终于,乌龟赢得比赛
package com.xiao.demo01;

public class Race implements Runnable {
    //胜利者
    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;
            }
            System.out.println(Thread.currentThread().getName() + "-->跑了" + i + "眼泪知道");
        }
    }

    //判断是否完成比赛
    public 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();
    }

}