java多线程之铁路售票系统
作者:beyond谚语 时间:2022-01-31 12:25:14
本文实例为大家分享了java多线程之铁路售票系统的具体代码,供大家参考,具体内容如下
问题:铁路售票,一共100张,通过四个窗口卖完。
要求:分别用
继承Thread类 和 实现Runnable接口 去实现
①用继承Thread类去实现
package com.yy.syn;
public class Demo3_Ticket {
/**
* 铁路售票,一共100张,通过四个窗口卖完
* 用继承Thread类去实现
* 分析:
* 四个窗口就相当于四条线程,100张火车票就相当于成员变量
*
* */
public static void main(String[] args) {
new Ticket().start(); //创建对象,第一条线程
new Ticket().start(); //创建对象,第二条线程
new Ticket().start(); //创建对象,第三条线程
new Ticket().start(); //创建对象,第四条线程
}
}
class Ticket extends Thread{ //继承Thread类
private static int ticket = 100; //四条线程公用这100个成员变量
// private static Object obj = new Object(); //如果用引用数据类型的成员变量当作锁对象,必须是静态的,这里的obj对象应该设置为static静态类型
public void run(){ //重写run()方法
while(true){
synchronized (Ticket.class) { //这里应该变为synchronized(obj){}
if(ticket <= 0){
break;
}
System.out.println(getName() + "...这是第" + ticket-- + "号票");
}
}
}
}
②用实现Runnable接口去实现
package com.yy.syn;
import java.security.GeneralSecurityException;
public class Demo4_Ticket {
/**
* 铁路售票,一共100张,通过四个窗口卖完
* 用实现Runnable接口去实现
* 分析:
* 四个窗口就相当于四条线程,100张火车票就相当于成员变量
*
* */
public static void main(String[] args) {
MyTicket mt = new MyTicket(); //这里只是创建了一次对象
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
/*Thread t1 = new Thread(mt);
//public void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。
t1.start();
t1.start();
t1.start();
t1.start();*/
}
}
class MyTicket implements Runnable{ //让MyTicket这个类去实现Runnable这个接口
private int tickets = 100; //然后,Myticket类里面定义成员变量,这里的票只有100张
@Override
public void run() {
while(true){
synchronized (Ticket.class) { //这里的锁对象也可以是this,即 synchronized (this),因为在主函数里面只创建了一次对象,这里的this就相当于主函数里面的mt
if(tickets <= 0){
break;
}
try{
Thread.sleep(10);
} catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "...这是第" + tickets-- + "号票" );
} //不是Thread的子类,不能直接调用getName,需要Thread.currentThread().getName()
}
}
private String getName() {
return null;
}
}
来源:https://blog.csdn.net/qq_41264055/article/details/81259315
标签:java,售票系统
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Android异步消息机制详解
2023-08-07 09:42:52
![](https://img.aspxhome.com/file/2023/0/85960_0s.png)
idea创建SpringBoot项目时Type选maven project和maven pom有何区别
2023-07-04 07:20:27
![](https://img.aspxhome.com/file/2023/9/57499_0s.png)
java反射遍历实体类属性和类型,并赋值和获取值的简单方法
2023-07-15 04:37:18
Spring Boot自动注入的原理分析
2023-03-29 04:19:44
IDEA部署JavaWeb项目到Tomcat服务器的方法
2023-11-02 23:21:22
Java下载文件时文件名乱码问题解决办法
2023-08-23 17:37:03
解析Java和Eclipse中加载本地库(.dll文件)的详细说明
2023-11-11 01:23:31
java实现简单的验证码功能
2023-08-06 09:21:44
java 中sendredirect()和forward()方法的区别
2021-11-07 18:39:28
Mybatis初始化知识小结
2023-11-01 13:59:27
![](https://img.aspxhome.com/file/2023/8/58708_0s.png)
Java_异常类(错误和异常,两者的区别介绍)
2023-09-19 08:53:27
![](https://img.aspxhome.com/file/2023/1/58311_0s.jpg)
分享Java常用开发编辑器工具
2023-11-06 07:35:37
![](https://img.aspxhome.com/file/2023/6/58896_0s.png)
Java面试synchronized偏向锁后hashcode存址
2023-08-09 09:15:06
![](https://img.aspxhome.com/file/2023/0/57920_0s.png)
spring定义和装配bean详解
2023-08-23 00:33:18
flutter日期选择器 flutter时间选择器
2023-09-22 04:50:15
![](https://img.aspxhome.com/file/2023/8/90158_0s.jpg)
Android 动画之TranslateAnimation应用详解
2023-06-27 06:17:59
![](https://img.aspxhome.com/file/2023/1/82411_0s.png)
Struts2实现文件上传功能实例解析
2023-11-04 04:56:13
![](https://img.aspxhome.com/file/2023/6/58836_0s.png)
synchronized背后的monitor锁实现详解
2023-07-31 08:14:10
详解Spring依赖注入的三种方式使用及优缺点
2023-06-09 18:29:00
![](https://img.aspxhome.com/file/2023/6/61046_0s.png)
c#中CAD文件读取实例
2023-07-23 19:37:59