多執行緒理解案例
阿新 • • 發佈:2021-08-19
購買火車票
12306
再熟悉不過的購票軟體
比如 G666
次列車 6
車6
F座 大家都想要
不能說一個人一個人去買 那麼第一個人就買到了 後面的人買不到
多執行緒 大家一起搶 憑運氣 誰搶到了就是誰的
示例
/* * 多個執行緒同時操作同一個物件 * 買火車票 * */ // 問題:多個執行緒操作同一個資源的時候 執行緒不安全 資料紊亂 public class TestRunnableTicket implements Runnable { // 車票總數 private static int ticketNums = 10; @Override public void run() { while (true) { if (ticketNums <= 0) { break; } System.out.println(Thread.currentThread().getName() + "===>拿到了第" + ticketNums-- + "張票"); } } public static void main(String[] args) { // 建立實現類物件 TestRunnableTicket t1 = new TestRunnableTicket(); // 建立執行緒物件 並執行 /* * public Thread(ThreadGroup group, String name) * * name 執行緒的名稱 * */ new Thread(t1, "wwbao").start(); new Thread(t1, "yyll").start(); new Thread(t1, "黑皮").start(); } }
目前還有一些問題 可能 張三 李四同時都會搶到這張票 所以 之前也說過 要保證資源的同步性
new Thread(t1, "wwbao").start();
new Thread(t1, "yyll").start();
new Thread(t1, "黑皮").start();
多個執行緒操作同一個物件
龜兔賽跑
兔子 和 烏龜 賽跑 一起跑
但是你不知道CPU先跑兔子還是烏龜
也不知道 兔子 烏龜 什麼時候跑完
但是最終都會有一個結果 到底時兔子贏了還是烏龜
我覺得這是多執行緒的魅力所在
示例
// 龜兔賽跑 public class TestRunnableRace implements Runnable { // 勝利者 private static String winner; @Override public void run() { for (int i = 1; i <= 100; i++) { // 模擬兔子睡覺 if (Thread.currentThread().getName().equals("兔子")){ try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } // 判斷比賽是否結束 boolean flag = gameOver(i); if (flag) { break; } System.out.println(Thread.currentThread().getName() + "===>跑了" + i + "步"); } } /** * 判斷比賽是否結束 * * @param steps * @return */ 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) { // 定義實現類物件 TestRunnableRace race = new TestRunnableRace(); // 定義執行緒物件 並執行 new Thread(race, "兔子").start(); new Thread(race, "烏龜").start(); } }
小結
-
多執行緒效率高 在我們生活中無處不見 但是其資源的同步性一定要保證 不然 像火車票 一個座位 兩個人
到時候要打架了 -
不要為了多執行緒而多執行緒
最適合的業務
去用就好