多線程數據共享之賣票問題

來看一道經典的多線程問題,多個售票窗口賣票:涉及到線程的創建,資源的掠奪,語法新特性等等。
ps:使用了jdk8的新特性 不懂請 看jdk8新特性

歡迎點贊關注:qq: 1184905186

public class ThreadTest03 {
    public static void main(String[] args) {
        TicketWindow ticketWindow = new TicketWindow(2000);
        List<Thread> list = new ArrayList<>();
        // 用來存儲買出去多少張票
        List<Integer> sellCount = new Vector<>();
        //200窗口賣2000張票
        for (int i = 1; i < 200; i++) {
            Thread t = new Thread(() -> {


                try {
                    //暴露問題
                    sleep(randomAmount());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // 分析這裏的競態條件 每個窗口賣的票數是隨機的
                int count = ticketWindow.sell(randomAmount());
                sellCount.add(count);
            },""+i);
            list.add(t);
            t.start();
        }
        list.forEach((t) -> {
            try {
                t.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        // 買出去的票求和
        System.out.println("一共賣了 :" + sellCount.stream().mapToInt(c -> c).sum());
        // 剩餘票數
        System.out.println("最後剩餘票數" + ticketWindow.getCount());
    }

    // Random 爲線程安全
    static Random random = new Random();

    // 隨機 1~5
    public static int randomAmount() {
        return random.nextInt(5) + 1;
    }
}

class TicketWindow {
    private int count;

    public TicketWindow(int count) {
        this.count = count;
    }

    public int getCount() {
        return count;
    }

    //資源競爭
    public synchronized int sell(int amount) {
        if (this.count >= amount) {
            this.count -= amount;
            System.out.printf("窗口 %s  賣了 %d 張,剩餘 %d 張票\n",Thread.currentThread().getName(),amount,count);
            return amount;
        } else {
            return 0;
        }
    }
}
"C:\Program Files\Java\jdk1.8.0_161\bin\java.exe" -javaagent:E:\install\IntelliJIDEA2018.3.6\lib\idea_rt.jar=55326:E:\install\IntelliJIDEA2018.3.6\bin -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_161\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\rt.jar;D:\javaEE\Sort\out\production\ThreadTest" ThreadTest03
窗口 8  賣了 4,剩餘 1996 張票
窗口 198  賣了 3,剩餘 1993 張票
窗口 195  賣了 4,剩餘 1989 張票
窗口 187  賣了 4,剩餘 1985 張票
窗口 176  賣了 3,剩餘 1982 張票
窗口 192  賣了 3,剩餘 1979 張票
窗口 197  賣了 4,剩餘 1975 張票
窗口 193  賣了 5,剩餘 1970 張票
窗口 179  賣了 5,剩餘 1965 張票
窗口 180  賣了 2,剩餘 1963 張票
窗口 189  賣了 1,剩餘 1962 張票
窗口 183  賣了 5,剩餘 1957 張票
窗口 185  賣了 4,剩餘 1953 張票
窗口 196  賣了 3,剩餘 1950 張票
窗口 181  賣了 4,剩餘 1946 張票
窗口 173  賣了 1,剩餘 1945 張票
窗口 199  賣了 4,剩餘 1941 張票
窗口 191  賣了 1,剩餘 1940 張票
窗口 164  賣了 4,剩餘 1936 張票
窗口 177  賣了 2,剩餘 1934 張票
窗口 167  賣了 4,剩餘 1930 張票
窗口 161  賣了 1,剩餘 1929 張票
窗口 158  賣了 1,剩餘 1928 張票
窗口 165  賣了 3,剩餘 1925 張票
窗口 194  賣了 1,剩餘 1924 張票
窗口 190  賣了 1,剩餘 1923 張票
窗口 186  賣了 4,剩餘 1919 張票
窗口 170  賣了 4,剩餘 1915 張票
窗口 188  賣了 3,剩餘 1912 張票
窗口 162  賣了 4,剩餘 1908 張票
窗口 156  賣了 1,剩餘 1907 張票
窗口 171  賣了 3,剩餘 1904 張票
窗口 163  賣了 1,剩餘 1903 張票
窗口 153  賣了 1,剩餘 1902 張票
窗口 150  賣了 3,剩餘 1899 張票
窗口 149  賣了 4,剩餘 1895 張票
窗口 146  賣了 3,剩餘 1892 張票
窗口 184  賣了 5,剩餘 1887 張票
窗口 182  賣了 1,剩餘 1886 張票
窗口 178  賣了 4,剩餘 1882 張票
窗口 175  賣了 5,剩餘 1877 張票
窗口 172  賣了 5,剩餘 1872 張票
窗口 168  賣了 2,剩餘 1870 張票
窗口 159  賣了 1,剩餘 1869 張票
窗口 152  賣了 2,剩餘 1867 張票
窗口 136  賣了 5,剩餘 1862 張票
窗口 155  賣了 4,剩餘 1858 張票
窗口 145  賣了 1,剩餘 1857 張票
窗口 174  賣了 1,剩餘 1856 張票
窗口 166  賣了 5,剩餘 1851 張票
窗口 169  賣了 5,剩餘 1846 張票
窗口 154  賣了 3,剩餘 1843 張票
窗口 134  賣了 1,剩餘 1842 張票
窗口 160  賣了 1,剩餘 1841 張票
窗口 133  賣了 1,剩餘 1840 張票
窗口 148  賣了 4,剩餘 1836 張票
窗口 147  賣了 1,剩餘 1835 張票
窗口 130  賣了 5,剩餘 1830 張票
窗口 143  賣了 3,剩餘 1827 張票
窗口 132  賣了 2,剩餘 1825 張票
窗口 125  賣了 4,剩餘 1821 張票
窗口 144  賣了 2,剩餘 1819 張票
窗口 140  賣了 1,剩餘 1818 張票
窗口 139  賣了 5,剩餘 1813 張票
窗口 119  賣了 1,剩餘 1812 張票
窗口 123  賣了 5,剩餘 1807 張票
窗口 157  賣了 1,剩餘 1806 張票
窗口 137  賣了 4,剩餘 1802 張票
窗口 117  賣了 1,剩餘 1801 張票
窗口 121  賣了 1,剩餘 1800 張票
窗口 129  賣了 2,剩餘 1798 張票
窗口 114  賣了 1,剩餘 1797 張票
窗口 141  賣了 5,剩餘 1792 張票
窗口 142  賣了 2,剩餘 1790 張票
窗口 105  賣了 2,剩餘 1788 張票
窗口 135  賣了 1,剩餘 1787 張票
窗口 151  賣了 3,剩餘 1784 張票
窗口 116  賣了 2,剩餘 1782 張票
窗口 120  賣了 1,剩餘 1781 張票
窗口 113  賣了 2,剩餘 1779 張票
窗口 108  賣了 3,剩餘 1776 張票
窗口 111  賣了 4,剩餘 1772 張票
窗口 131  賣了 4,剩餘 1768 張票
窗口 102  賣了 3,剩餘 1765 張票
窗口 138  賣了 1,剩餘 1764 張票
窗口 110  賣了 5,剩餘 1759 張票
窗口 101  賣了 1,剩餘 1758 張票
窗口 97  賣了 2,剩餘 1756 張票
窗口 96  賣了 2,剩餘 1754 張票
窗口 128  賣了 1,剩餘 1753 張票
窗口 127  賣了 2,剩餘 1751 張票
窗口 112  賣了 1,剩餘 1750 張票
窗口 124  賣了 1,剩餘 1749 張票
窗口 107  賣了 2,剩餘 1747 張票
窗口 99  賣了 2,剩餘 1745 張票
窗口 126  賣了 1,剩餘 1744 張票
窗口 118  賣了 1,剩餘 1743 張票
窗口 90  賣了 3,剩餘 1740 張票
窗口 82  賣了 3,剩餘 1737 張票
窗口 93  賣了 5,剩餘 1732 張票
窗口 81  賣了 4,剩餘 1728 張票
窗口 122  賣了 1,剩餘 1727 張票
窗口 98  賣了 5,剩餘 1722 張票
窗口 104  賣了 1,剩餘 1721 張票
窗口 115  賣了 2,剩餘 1719 張票
窗口 103  賣了 3,剩餘 1716 張票
窗口 80  賣了 3,剩餘 1713 張票
窗口 79  賣了 1,剩餘 1712 張票
窗口 92  賣了 3,剩餘 1709 張票
窗口 109  賣了 5,剩餘 1704 張票
窗口 106  賣了 5,剩餘 1699 張票
窗口 94  賣了 2,剩餘 1697 張票
窗口 84  賣了 4,剩餘 1693 張票
窗口 100  賣了 3,剩餘 1690 張票
窗口 63  賣了 2,剩餘 1688 張票
窗口 68  賣了 5,剩餘 1683 張票
窗口 76  賣了 4,剩餘 1679 張票
窗口 69  賣了 5,剩餘 1674 張票
窗口 86  賣了 3,剩餘 1671 張票
窗口 62  賣了 4,剩餘 1667 張票
窗口 66  賣了 3,剩餘 1664 張票
窗口 50  賣了 3,剩餘 1661 張票
窗口 77  賣了 1,剩餘 1660 張票
窗口 88  賣了 5,剩餘 1655 張票
窗口 53  賣了 2,剩餘 1653 張票
窗口 95  賣了 1,剩餘 1652 張票
窗口 91  賣了 1,剩餘 1651 張票
窗口 59  賣了 5,剩餘 1646 張票
窗口 72  賣了 2,剩餘 1644 張票
窗口 71  賣了 2,剩餘 1642 張票
窗口 47  賣了 1,剩餘 1641 張票
窗口 61  賣了 3,剩餘 1638 張票
窗口 57  賣了 1,剩餘 1637 張票
窗口 74  賣了 1,剩餘 1636 張票
窗口 73  賣了 4,剩餘 1632 張票
窗口 70  賣了 5,剩餘 1627 張票
窗口 75  賣了 2,剩餘 1625 張票
窗口 39  賣了 1,剩餘 1624 張票
窗口 60  賣了 3,剩餘 1621 張票
窗口 67  賣了 2,剩餘 1619 張票
窗口 44  賣了 4,剩餘 1615 張票
窗口 24  賣了 5,剩餘 1610 張票
窗口 28  賣了 1,剩餘 1609 張票
窗口 32  賣了 1,剩餘 1608 張票
窗口 87  賣了 5,剩餘 1603 張票
窗口 83  賣了 3,剩餘 1600 張票
窗口 38  賣了 4,剩餘 1596 張票
窗口 65  賣了 4,剩餘 1592 張票
窗口 42  賣了 5,剩餘 1587 張票
窗口 33  賣了 1,剩餘 1586 張票
窗口 54  賣了 2,剩餘 1584 張票
窗口 85  賣了 1,剩餘 1583 張票
窗口 89  賣了 1,剩餘 1582 張票
窗口 78  賣了 2,剩餘 1580 張票
窗口 40  賣了 5,剩餘 1575 張票
窗口 35  賣了 2,剩餘 1573 張票
窗口 23  賣了 1,剩餘 1572 張票
窗口 27  賣了 3,剩餘 1569 張票
窗口 31  賣了 2,剩餘 1567 張票
窗口 52  賣了 5,剩餘 1562 張票
窗口 48  賣了 5,剩餘 1557 張票
窗口 41  賣了 4,剩餘 1553 張票
窗口 45  賣了 4,剩餘 1549 張票
窗口 36  賣了 5,剩餘 1544 張票
窗口 25  賣了 3,剩餘 1541 張票
窗口 46  賣了 3,剩餘 1538 張票
窗口 43  賣了 2,剩餘 1536 張票
窗口 12  賣了 2,剩餘 1534 張票
窗口 51  賣了 5,剩餘 1529 張票
窗口 16  賣了 3,剩餘 1526 張票
窗口 30  賣了 5,剩餘 1521 張票
窗口 49  賣了 1,剩餘 1520 張票
窗口 64  賣了 5,剩餘 1515 張票
窗口 56  賣了 1,剩餘 1514 張票
窗口 58  賣了 1,剩餘 1513 張票
窗口 55  賣了 4,剩餘 1509 張票
窗口 14  賣了 1,剩餘 1508 張票
窗口 7  賣了 3,剩餘 1505 張票
窗口 4  賣了 5,剩餘 1500 張票
窗口 29  賣了 4,剩餘 1496 張票
窗口 22  賣了 3,剩餘 1493 張票
窗口 37  賣了 3,剩餘 1490 張票
窗口 34  賣了 5,剩餘 1485 張票
窗口 26  賣了 2,剩餘 1483 張票
窗口 19  賣了 4,剩餘 1479 張票
窗口 20  賣了 4,剩餘 1475 張票
窗口 15  賣了 5,剩餘 1470 張票
窗口 21  賣了 3,剩餘 1467 張票
窗口 18  賣了 5,剩餘 1462 張票
窗口 11  賣了 2,剩餘 1460 張票
窗口 17  賣了 3,剩餘 1457 張票
窗口 13  賣了 1,剩餘 1456 張票
窗口 2  賣了 1,剩餘 1455 張票
窗口 6  賣了 3,剩餘 1452 張票
窗口 3  賣了 3,剩餘 1449 張票
窗口 10  賣了 5,剩餘 1444 張票
窗口 9  賣了 5,剩餘 1439 張票
窗口 5  賣了 5,剩餘 1434 張票
窗口 1  賣了 2,剩餘 1432 張票
一共賣了 :568
剩餘票數1432
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章