來看一道經典的多線程問題,多個售票窗口賣票:涉及到線程的創建,資源的掠奪,語法新特性等等。
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