多线程
继承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(); } }