多线程

继承Thread类

1  子类继承Thread类具备多线程能力

2  启动线程:子类对象.start()

3  不建议使用:避免OOP但继承局限性。

public class ThreadTest extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
            System.out.println("这里是run方法。。。。。"+i);

        }
    }

    public static void main(String[] args) {
        ThreadTest t1=new ThreadTest();
        t1.start();
        for (int i = 0; i < 200; i++) {
            System.out.println("这里是主方法。。。。、、、、"+i);
        }
    }
}

实现Runnable接口

1 实现接口Runnable具有多线程能力

2 启动线程:传入目标对象+Thread对象.start()

3 推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用

但此是线程不安全的,会出现同资源被多个线程使用,造成混乱。

// 买火车票,同一个对象(火车票),被多个线程(多个人买)使用。但此是线程不安全的,运行后出现同一张票被多个人买到的情况。

public class BuyTicketThread 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) {
//一份资源 BuyTicketThread buyTicketThread
= new BuyTicketThread();
//多个代理
new Thread(buyTicketThread,"小龙").start(); new Thread(buyTicketThread,"老师").start(); new Thread(buyTicketThread,"黄牛党").start(); } }

案例:模拟龟兔赛跑

1 首先来个赛道距离,然后离终点越来越近
2 判断比赛是否结束
3 打印出胜利者
4 比赛开始
5 故事中乌龟总是赢的,兔子要睡觉,所以来模拟兔子睡觉
6 终于,乌龟赢得了比赛
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(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //判断比赛是否结束
            boolean flag = gameOver(i);
            //如果比赛结束了,就停止程序
            if (flag) {
                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();
    }
}
原文地址:https://www.cnblogs.com/dragon-lan/p/14065712.html