【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 ...
随机推荐
- docker-compose 搭建 Prometheus+Grafana监控系统
有关监控选型之前有写过一篇文章: 监控系统选型,一文轻松搞定! 监控对象 Linux服务器 Docker Redis MySQL 数据采集 1).prometheus: 采集数据 2).node-ex ...
- ExtJS 布局-Border 布局(Border layout)
更新记录: 2022年6月11日 发布. 2022年6月1日 开始. 1.说明 边框布局允许根据区域(如中心.北部.南部.西部和东部)指定子部件的位置.还可以调整子组件的大小和折叠. 2.设置布局方法 ...
- 写个js获取2019博客之星投票活动的名次与投票数
获取投票数 // app.jsvar request = require('request');var cheerio = require('cheerio');request('http://m23 ...
- 关于android里activity之间利用button组件使用intent跳转页面
在需要跳转的activity 中 添加 Button button = findViewById(R.id.login);button.setOnClickListener(new View.OnCl ...
- GitLab、Jenkins结合构建持续集成(CI)环境
1 持续集成 概述及运行流程 1.1 持续集成概述 持续集成概述:持续集成(Continuous integration)持续集成是指开发者在代码的开发过程中,可以频繁的将代码部署集成到主干,并迚程自 ...
- ssh-免密钥登陆
实现openssh免密钥登陆(公私钥验证) 在主机A上,通过root用户,使用ssh-keygen生成的两个密钥:id_rsa和id_rsa.pub 私钥(id_rsa)保存在本地主机,公钥(id_r ...
- python报错合集
哈喽,大家好呀 我又来啦,今天让我们来看看python中有哪些常见的异常报错吧 说到python中的报错,我们总是脑壳疼现在我们要学会去认识报错的类型 这样子,在我们出现报错的时候就可以知道报错的原因 ...
- SpringMVC 概述
1. SpringMVC 概述 1) Spring 为展现层提供的基于 MVC 设计理念的优秀的 Web 框架,是目前最主流的MVC 框架之一 .MVC,M:model,模型层,指的是项目中的实体Ja ...
- MIT 6.824 Lab2A Raft之领导者选举
实验准备 实验代码:git://g.csail.mit.edu/6.824-golabs-2021/src/raft 如何测试:go test -run 2A -race 相关论文:Raft Exte ...
- 004 SpringSecurity验证规则
SpringSecurity验证规则 SpringSecurity框架登录后,==在userDetails对象中,一定会有一个权限列表 == 登录用户对象的值可能是: {"authoriti ...