多线程中的售票问题
发布日期:2022-04-11 08:52:44
浏览次数:9
分类:技术文章
本文共 2952 字,大约阅读时间需要 9 分钟。
在日常生活中我们可以观察到售票是多个窗口进行售票的,那么他是如何解决票如何卖完的呢。
这里就涉及到了多线程的问题了。
方案一:
package thread;/** * @auther 言行 */public class SellTicket { public static void main(String[] args) { SellTicket01 sellTicket01 = new SellTicket01(); SellTicket01 sellTicket011 = new SellTicket01(); SellTicket01 sellTicket012 = new SellTicket01(); sellTicket01.start(); sellTicket011.start(); sellTicket012.start(); }}class SellTicket01 extends Thread{ private static int ticketNum = 100; @Override public void run() { while(true){ if (ticketNum<=0){ System.out.println("票卖完了"); break; } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("窗口"+ Thread.currentThread().getName() + " "+(--ticketNum)); } }}
从结果上看好像不行,应为你回发现他居然回有-1的产生,正常人到知道剩余票是没有负数之说的,很显然这并不可行。
方案二:
我们使用Thread的接口Runnable试试
package thread;/** * @auther 言行 */public class SellTicket { public static void main(String[] args) { SellTicket02 sellTicket02 = new SellTicket02(); new Thread(sellTicket02).start(); new Thread(sellTicket02).start(); new Thread(sellTicket02).start(); }}class SellTicket02 implements Runnable{ private int ticketNum = 100; @Override public void run() { while(true){ if (ticketNum<=0){ System.out.println("票卖完了"); break; } try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("窗口"+ Thread.currentThread().getName() + " "+(--ticketNum)); } }}
哦豁完蛋,从结果上看显然是不行的,那到底是什么东西造成这样的结能,其实造成这样结果的原因是一样的,都是线程的抢占的结果。
方案一中创建了三个SellTicket01,有三个线程的使用他们都在使用run()方法,那么就回发生线程的抢占问题,当第一个线程进入run()执行 if (ticketNum<=0)是线程一还没有往下走时线程二就执行了 if (ticketNum<=0),那我们就回发现多买的情况了(这里的线程一和二是简称,在你运行时可能是Thread-0或Thread-1)。
方案三:用线程同步机制解决sychronized(同步的)。
package sychronized;/** * @auther 言行 */public class SellTicket { public static void main(String[] args) { SellTicket02 sellTicket02 = new SellTicket02(); new Thread(sellTicket02).start(); new Thread(sellTicket02).start(); new Thread(sellTicket02).start(); }}class SellTicket02 implements Runnable{ private int ticketNum = 100; private boolean loop = true; public synchronized void sell(){ if (ticketNum<=0){ System.out.println("票卖完了"); loop = false; return; } try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("窗口"+ Thread.currentThread().getName() + " "+(--ticketNum)); } @Override public void run() { while(loop){ sell(); } }}
转载地址:https://blog.csdn.net/lanjingyuya/article/details/123386618 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2024年03月29日 14时15分23秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
JXFCZX — 质数和分解(完全背包)
2019-04-28
JXFCZX — 花店橱窗(动态规划)
2019-04-28
JXFCZX — 逃亡的准备(多重背包)
2019-04-28
JXFCZX — 庆功会(多重背包)
2019-04-28
AcWing - 扩展欧几里得算法(扩欧)
2019-04-28
AcWing - 高斯消元解线性方程组(高斯消元)
2019-04-28
AcWing - 求组合数 I(递推)
2019-04-28
AcWing - 求组合数 II(预处理&逆元)
2019-04-28
AcWing - 求组合数 III(lucas&逆元)
2019-04-28
AcWing - 求组合数 IV(分解质因数)
2019-04-28
AcWing - 满足条件的01序列(组合数学&卡特兰数)
2019-04-28
AcWing - 快速排序(快排)
2019-04-28
AcWing - 归并排序(归排)
2019-04-28
AcWing - 数的范围(二分)
2019-04-28
AcWing - 数的三次方根(二分)
2019-04-28
AcWing - 高精度加法(大数加法)
2019-04-28
AcWing - 高精度减法(大数减法)
2019-04-28
AcWing - 高精度乘法(大数乘法)
2019-04-28
AcWing - 高精度除法(大数除法)
2019-04-28
AcWing - 前缀和(前缀和)
2019-04-28