多线程中的售票问题
发布日期: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秒