ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【Java】学习路径49-练习:使用两个不同的线程类实现买票系统

2022-05-11 23:31:26  阅读:191  来源: 互联网

标签:Runnable Java Thread 49 lock 线程 new public


练习:使用两个不同的线程类实现买票系统

请创建两个不同的线程类、一个测试类以及一个票的管理类。

其中票的管理类用于储存票的数量。两个线程类看作不同的买票方式。


步骤:

1、创建所需的类

App售票线程类

public class Runnable_AppTicketSeller implements Runnable{
    @Override
    public void run() {
    }
}

Web售票线程类

public class Runnable_WebTicketSeller implements Runnable{
    @Override
    public void run() {
    }
}

买票测试类

public class BuyTicket {
    public static void main(String[] args) {
        Runnable_AppTicketSeller ra = new Runnable_AppTicketSeller();
        Runnable_WebTicketSeller rb = new Runnable_WebTicketSeller();
        Thread tApp = new Thread(ra,"App售票");
        Thread tWeb = new Thread(rb,"Web售票");
        tApp.start();
        tWeb.start();
    }
}

 票务管理类

public class TicketMgr {
    public static int count = 100;
}

 

2、编写两个售票类

 在两个run()中加入:

while (true){
    if(TicketMgr.count>0){
        System.out.println(Thread.currentThread().getName()+"卖出第"+TicketMgr.count+"张票");
        TicketMgr.count--;
    }else break;
}

我们需要在这添加线程锁。

但是我们现在是两个不同的线程类,按照以前的方法是不行的。

我们可以在售票处构造一个lock,然后传进两个线程类中。

那么我们要为两个线程类添加一个构造方法,传入同一个lock锁。

售票类:

public class BuyTicket {
    public static void main(String[] args) {
        Object lock = new Object();
        Runnable_AppTicketSeller ra = new Runnable_AppTicketSeller(lock);
        Runnable_WebTicketSeller rb = new Runnable_WebTicketSeller(lock);
        Thread tApp = new Thread(ra,"App售票");
        Thread tWeb = new Thread(rb,"Web售票");
        tApp.start();
        tWeb.start();
    }
}

两个线程类:

public class Runnable_AppTicketSeller implements Runnable{
    Object lock;
    public Runnable_AppTicketSeller(Object lo){
        lock = lo;
    }
    @Override
    public void run() {
        while (true){
            synchronized (lock) {
                if (TicketMgr.count > 0) {
                    System.out.println(Thread.currentThread().getName() + "卖出第" + TicketMgr.count + "张票");
                    TicketMgr.count--;
                } else break;
            }
        }
    }
}
public class Runnable_WebTicketSeller implements Runnable{
    Object lock;
    public Runnable_WebTicketSeller(Object lo){
        lock = lo;
    }
    @Override
    public void run() {
        while (true){
            synchronized (lock) {
                if (TicketMgr.count > 0) {
                    System.out.println(Thread.currentThread().getName() + "卖出第" + TicketMgr.count + "张票");
                    TicketMgr.count--;
                } else break;
            }
        }
    }
}

3、简化代码

public class BuyTicket {
    public static void main(String[] args) {
        Object lock = new Object();
        Runnable_AppTicketSeller ra = new Runnable_AppTicketSeller(lock);
        Runnable_WebTicketSeller rb = new Runnable_WebTicketSeller(lock);
        new Thread(ra,"App售票").start();
        new Thread(rb,"Web售票").start();
    }
}

 

完成✅

 

标签:Runnable,Java,Thread,49,lock,线程,new,public
来源: https://www.cnblogs.com/remyuu/p/16260466.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有