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

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

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


步骤:

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. Linux(Centos7)静默安装Oracle19C

    Oracle数据库服务器一般都是Linux,Linux服务器一般都是在非图形界面的操作,本文章手把手教你如何在非图形界面安装Oracle19C. ORACLE 19C 的安装包自行在官网下载,下载免费 ...

  2. MySQL 千万数据库深分页查询优化,拒绝线上故障!

    文章首发在公众号(龙台的技术笔记),之后同步到博客园和个人网站:xiaomage.info 优化项目代码过程中发现一个千万级数据深分页问题,缘由是这样的 库里有一张耗材 MCS_PROD 表,通过同步 ...

  3. 【Redis】字典

    Redis 字典 基本语法 字典是Redis中的一种数据结构,底层使用哈希表实现,一个哈希表中可以存储多个键值对,它的语法如下,其中KEY为键,field和value为值(也是一个键值对): HSET ...

  4. 打字练习-编程语言关键字系列-html

    以下是小编整理的部分html关键字,专门给有需要的朋友进行打字练习用,通过打字练习的方式,既提高了打字速度,又可以熟悉html关键字~~~ www, url, http, W3C, html, htm ...

  5. NCF 的Azure Cosmos DB 演示案例

    简介 NCF想必看过我之前发的NCF的文章的同学们都已经很熟悉了 今天我们要来聊一聊的是NCF遇到Azure Cosmos DB后会碰撞出什么样的火花,让我们一起往下看 我们先来说说什么是Azure ...

  6. BUUCTF-乌镇峰会种图

    乌镇峰会种图 16进制拖到底一看便知

  7. MySQL case when then 用法

    下面演示一下MYSQL中的CASE WHEN THEN的用法. 一. SELECT MENU_NAME, YXBZ, case YXBZ when 'Y' then '开放' when 'N' the ...

  8. windows server2012R2 上 .net core IIS 部署--应用程序池 自动停止

    在windows server2016安装部署.NET CORE时,只需要将.net core应用程序池设置无托管,然后对应你项目的版本安装一个dotnet-hosting-2.2.6-win.exe ...

  9. 『现学现忘』Git后悔药 — 27、版本回退介绍

    目录 1.什么版本回退 2.需要了解两个知识点 (1)HEAD是什么 (2)HEAD指针用法 3.git reflog命令介绍 1.什么版本回退 版本回退也可以叫回滚. 若修改过的文件,不仅添加到了暂 ...

  10. Properties集合中的方法store和Properties集合中的方法load

    Properties集合中的方法store public class Demo01Properties { public static void main(String[] args) throws ...