1. 程式人生 > 其它 >多執行緒理解案例

多執行緒理解案例

購買火車票

12306 再熟悉不過的購票軟體

比如 G666次列車 66F座 大家都想要

不能說一個人一個人去買 那麼第一個人就買到了 後面的人買不到

多執行緒 大家一起搶 憑運氣 誰搶到了就是誰的

示例

/*
 * 多個執行緒同時操作同一個物件
 * 買火車票
 * */

// 問題:多個執行緒操作同一個資源的時候 執行緒不安全 資料紊亂
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();
    }
}

小結

  1. 多執行緒效率高 在我們生活中無處不見 但是其資源的同步性一定要保證 不然 像火車票 一個座位 兩個人
    到時候要打架了

  2. 不要為了多執行緒而多執行緒 最適合的業務去用就好

即使再小的帆也能遠航