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

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

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


步骤:

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();
}
}

完成

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

  1. Java学习路径及练手项目合集

    Java 在编程语言排行榜中一直位列前排,可知 Java 语言的受欢迎程度了. 实验楼上的[Java 学习路径]中将首先完成 Java基础.JDK.JDBC.正则表达式等基础实验,然后进阶到 J2SE ...

  2. Java学习路径(抛光砖)

    这就是我刚刚在五孔问答中找到的Java学习路线图抛光砖价格.我个人认为,这条Java学习路线是可以的.它是2018年相对较新的Java学习路线,更符合企业就业标准. Java学习路径的第一阶段:Jav ...

  3. Java学习路径:不走弯路,这是一条捷径

    1.如何学习编程? JAVA是一种平台.也是一种程序设计语言,怎样学好程序设计不只适用于JAVA,对C++等其它程序设计语言也一样管用.有编程高手觉得,JAVA也好C也好没什么分别,拿来就用.为什么他 ...

  4. Java学习笔记49(DBUtils工具类二)

    上一篇文章是我们自己模拟的DBUtils工具类,其实有开发好的工具类 这里使用commons-dbutils-1.6.jar 事务的简单介绍: 在数据库中应用事务处理案例:转账案例 张三和李四都有有自 ...

  5. Java学习之约瑟夫环的两中处理方法

    package day_2; import java.util.Scanner; /** * @author Administrator * 约瑟夫环问题: 设编号为 1,2,3,....n的N个人围 ...

  6. Java学习路径

    -------第一部分:基础语法-------- 1.输出语句 1.1 hello world 1.2 拼接输出.换行和不换行输出 1.3 拼接变量输出 2.输入语句: 2.1 定义变量,赋值(整数. ...

  7. 【Java学习笔记之十二】Java8增强的工具类:Arrays的用法整理总结

    本文将整理 java.util.Arrays 工具类比较常用的方法:  本文介绍的方法基于JDK 1.7 之上.  1.  asList方法 @SafeVarargs public static &l ...

  8. Java学习笔记43(打印流、IO流工具类简单介绍)

    打印流: 有两个类:PrintStream,PrintWriter类,两个类的方法一致,区别在于构造器 PrintStream:构造方法:接收File类型,接收字符串文件名,接收字节输出流(Outpu ...

  9. Java学习笔记33(集合框架七:Collections工具类)

    数组有工具类,方面操作数组 集合也有工具类:Collections 常用方法示例: package demo; import java.util.ArrayList; import java.util ...

随机推荐

  1. 学了WEB缓冲投毒-挖SRC的时候咋利用

    学了WEB缓冲投毒-挖SRC的时候咋利用 昨天发了哥WEB缓存投毒的学习文章,但是除了理论和训练营并无实践,正巧翻到了一篇文章,感觉还有点关系,转的一个国外的老哥的文章. 微信公众号:小惜渗透,欢迎大 ...

  2. Metasploit msfvenom

    一. msfvenom简介 msfvenom是msf payload和msf encode的结合体,于2015年6月8日取代了msf payload和msf encode.在此之后,metasploi ...

  3. Sentiment analysis in nlp

    Sentiment analysis in nlp The goal of the program is to analysis the article title is Sarcasm or not ...

  4. 『现学现忘』Git后悔药 — 28、版本回退git reset --soft命令说明

    git reset --soft commit-id命令:回退到指定版本.(soft:柔软的) 该命令仅仅修改分支中的HEAD指针的位置,不会改变工作区与暂存区中的文件的版本. 实现上是只做了一件事情 ...

  5. cup缓存基础知识

    目录 cup缓存 缓存结构 直接映射缓存 cup缓存 CPU缓存(CPU Cache)的目的是为了提高访问内存(RAM)的效率,这虽然已经涉及到硬件的领域,但它仍然与我们息息相关,了解了它的一些原理, ...

  6. Node.js精进(9)——性能监控(上)

    市面上成熟的 Node.js 性能监控系统,监控的指标有很多. 以开源的 Easy-Monitor 为例,在系统监控一栏中,指标包括内存.CPU.GC.进程.磁盘等. 这些系统能全方位的监控着应用的一 ...

  7. PaddleOCR系列(二)--hubserving & pdserving & hub install

    一.各种部署方式特点及注意事项 简称 hubserving=PaddleHub Serving pdserving=PaddleHub Serving hub install =指通过paddlehu ...

  8. C++学习日记:关于我决定开始学习C++的那些事

    苦恼于Python运行时感人的速度,我决定学习C++. 为了激励我自己好好地学习这门未曾谋面的编程语言,我决定在此开设专栏:C++学习日记.希望在读者们的监督下,我可以早日掌握这门语言.当然,如果那位 ...

  9. 5-10 Quartz 任务调度

    Quartz 什么是Quartz quartz:石英钟的意思 是一个当今市面上流行的高效的任务调度管理工具 由OpenSymphony开源组织开发 Symphony:交响乐 是java编写的,我们使用 ...

  10. Class对象共嫩

    需求:写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法 实现: 1.配置文件 2.反射 步骤: 1.将需要创建的对象的全类名和需要执 ...