案例:实现一个抢火车票的案例demo
package com.thread; // 多线程同时操作同一个对象 // 买火车票的例子 // 发现问题:多线程操作同一个资源的情况下,线程不安全,数据紊乱 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(); } }
黄油党拿到了第10票 老师拿到了第8票 小明拿到了第9票 老师拿到了第7票 小明拿到了第5票 黄油党拿到了第6票 小明拿到了第4票 黄油党拿到了第4票 老师拿到了第3票 小明拿到了第2票 黄油党拿到了第1票 老师拿到了第0票
package com.thread; // 模拟龟兔赛跑 public class Race implements Runnable { // 胜利者 private static String winner; @Override public void run() { for (int i = 1; i <= 100; i++) { // 模拟兔子睡觉 每10步并且是兔子让它睡一会 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); return true; } } return false; } public static void main(String[] args) { Race race = new Race(); new Thread(race, "兔子").start(); new Thread(race, "乌龟").start(); } }