来看一道经典的多线程问题,多个售票窗口卖票:涉及到线程的创建,资源的掠夺,语法新特性等等。 ps:使用了jdk8的新特性 不懂请 看jdk8新特性 public class ThreadTest03 { public static voi
来看一道经典的多线程问题,多个售票窗口卖票:涉及到线程的创建,资源的掠夺,语法新特性等等。
ps:使用了jdk8的新特性 不懂请 看jdk8新特性
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