【Java】学习路径49-练习:使用两个不同的线程类实现买票系统
练习:使用两个不同的线程类实现买票系统
请创建两个不同的线程类、一个测试类以及一个票的管理类。
其中票的管理类用于储存票的数量。两个线程类看作不同的买票方式。
步骤:
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-练习:使用两个不同的线程类实现买票系统的更多相关文章
- Java学习路径及练手项目合集
Java 在编程语言排行榜中一直位列前排,可知 Java 语言的受欢迎程度了. 实验楼上的[Java 学习路径]中将首先完成 Java基础.JDK.JDBC.正则表达式等基础实验,然后进阶到 J2SE ...
- Java学习路径(抛光砖)
这就是我刚刚在五孔问答中找到的Java学习路线图抛光砖价格.我个人认为,这条Java学习路线是可以的.它是2018年相对较新的Java学习路线,更符合企业就业标准. Java学习路径的第一阶段:Jav ...
- Java学习路径:不走弯路,这是一条捷径
1.如何学习编程? JAVA是一种平台.也是一种程序设计语言,怎样学好程序设计不只适用于JAVA,对C++等其它程序设计语言也一样管用.有编程高手觉得,JAVA也好C也好没什么分别,拿来就用.为什么他 ...
- Java学习笔记49(DBUtils工具类二)
上一篇文章是我们自己模拟的DBUtils工具类,其实有开发好的工具类 这里使用commons-dbutils-1.6.jar 事务的简单介绍: 在数据库中应用事务处理案例:转账案例 张三和李四都有有自 ...
- Java学习之约瑟夫环的两中处理方法
package day_2; import java.util.Scanner; /** * @author Administrator * 约瑟夫环问题: 设编号为 1,2,3,....n的N个人围 ...
- Java学习路径
-------第一部分:基础语法-------- 1.输出语句 1.1 hello world 1.2 拼接输出.换行和不换行输出 1.3 拼接变量输出 2.输入语句: 2.1 定义变量,赋值(整数. ...
- 【Java学习笔记之十二】Java8增强的工具类:Arrays的用法整理总结
本文将整理 java.util.Arrays 工具类比较常用的方法: 本文介绍的方法基于JDK 1.7 之上. 1. asList方法 @SafeVarargs public static &l ...
- Java学习笔记43(打印流、IO流工具类简单介绍)
打印流: 有两个类:PrintStream,PrintWriter类,两个类的方法一致,区别在于构造器 PrintStream:构造方法:接收File类型,接收字符串文件名,接收字节输出流(Outpu ...
- Java学习笔记33(集合框架七:Collections工具类)
数组有工具类,方面操作数组 集合也有工具类:Collections 常用方法示例: package demo; import java.util.ArrayList; import java.util ...
随机推荐
- 学了WEB缓冲投毒-挖SRC的时候咋利用
学了WEB缓冲投毒-挖SRC的时候咋利用 昨天发了哥WEB缓存投毒的学习文章,但是除了理论和训练营并无实践,正巧翻到了一篇文章,感觉还有点关系,转的一个国外的老哥的文章. 微信公众号:小惜渗透,欢迎大 ...
- Metasploit msfvenom
一. msfvenom简介 msfvenom是msf payload和msf encode的结合体,于2015年6月8日取代了msf payload和msf encode.在此之后,metasploi ...
- Sentiment analysis in nlp
Sentiment analysis in nlp The goal of the program is to analysis the article title is Sarcasm or not ...
- 『现学现忘』Git后悔药 — 28、版本回退git reset --soft命令说明
git reset --soft commit-id命令:回退到指定版本.(soft:柔软的) 该命令仅仅修改分支中的HEAD指针的位置,不会改变工作区与暂存区中的文件的版本. 实现上是只做了一件事情 ...
- cup缓存基础知识
目录 cup缓存 缓存结构 直接映射缓存 cup缓存 CPU缓存(CPU Cache)的目的是为了提高访问内存(RAM)的效率,这虽然已经涉及到硬件的领域,但它仍然与我们息息相关,了解了它的一些原理, ...
- Node.js精进(9)——性能监控(上)
市面上成熟的 Node.js 性能监控系统,监控的指标有很多. 以开源的 Easy-Monitor 为例,在系统监控一栏中,指标包括内存.CPU.GC.进程.磁盘等. 这些系统能全方位的监控着应用的一 ...
- PaddleOCR系列(二)--hubserving & pdserving & hub install
一.各种部署方式特点及注意事项 简称 hubserving=PaddleHub Serving pdserving=PaddleHub Serving hub install =指通过paddlehu ...
- C++学习日记:关于我决定开始学习C++的那些事
苦恼于Python运行时感人的速度,我决定学习C++. 为了激励我自己好好地学习这门未曾谋面的编程语言,我决定在此开设专栏:C++学习日记.希望在读者们的监督下,我可以早日掌握这门语言.当然,如果那位 ...
- 5-10 Quartz 任务调度
Quartz 什么是Quartz quartz:石英钟的意思 是一个当今市面上流行的高效的任务调度管理工具 由OpenSymphony开源组织开发 Symphony:交响乐 是java编写的,我们使用 ...
- Class对象共嫩
需求:写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法 实现: 1.配置文件 2.反射 步骤: 1.将需要创建的对象的全类名和需要执 ...