java多线程之铁路售票系统
作者:beyond谚语 发布时间:2022-01-31 12:25:14
标签:java,售票系统
本文实例为大家分享了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


猜你喜欢
- 本文实例讲述了C#图像处理之头发检测的方法。分享给大家供大家参考。具体如下://发色检测(YCbCr颜色空间)public Bitmap H
- 前言学习Java和Android将近一年的时间了,期间的成果应该就是独立完成了一个Android客户端,并且保证了其在主线版本的稳定性。期间
- 简介反射是Java编程语言中的一个特性。它允许执行的Java程序检查或 操作 自身,并操作程序的内部属性。例如,Java类可以获取其所有成员
- 源码:class T {int m = 8;}T t = new T();汇编码:0 new #2 <T>3 dup4 invo
- 前言最近因为一些个人原因,未能抽出太多精力更新Java多线程系列,一搁置就是好几个月,先向读者诸君致歉。在本系列的其他文章中,已经提到过线程
- 概述在 Linux 平台下使用搜狗输入法在 IDEA 中输入中文时,输入法候选框总是静止在 IDEA 的左下角,而不能跟随光标进行移动。虽然
- Dagger2注入框架原理简要分析使用Dagger2需要的依赖:implementation 'com.google.dagger:
- 我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还
- 我们在项目中都会遇到项目打包,可以通过assembly对我们的项目进行打包。针对打包构建jar包,本文不再叙述。具体可以参考maven插件a
- 前言:项目中经常会用到类似于QQ侧滑点击删除的效果,网上的开源库也很多。个人感觉SwipeLayout最好用。下面介绍怎么使用。一、首先导入
- 求一个n阶行列式,一个比较简单的方法就是使用全排列的方法,那么简述以下全排列算法的递归实现。首先举一个简单的例子说明算法的原理,既然是递归,
- 一、缓存的基本概念缓存 。这是一个简单但非常有效的概念,这个想法的核心是记录过程数据,重用操作结果。当执行繁重的操作时,我们会将结果保存在我
- 本文主要关注如何使用mybatis/mybatis plus连接SQL Server数据库,因此将省略其他项目配置、代码。框架选择应用框架:
- 前言在Java开发者中,字符串的拼接占用资源高往往是热议的话题.让我们深入讨论一下为什么会占用高资源。在Java中,字符串对象是不可变的,意
- 我们知道 Spring Boot 已经提供了一套默认的异常处理机制,但是 Spring Boot 提供的默认异常处理机制却并不一定适合我们实
- 看一段程序String t = "a||b||c||d";String[] temp = t.split("\
- JPA设置表名和实体名,表字段与实体字段的对应首先 你的jpaProperties配置项中要有<prop key="hibe
- Android 6本文根据我个人的开发经验,总结了从 Android 6 - Android 13 重要的行为变更。当然,这不是 Andro
- 本文实例为大家分享了java实现飞机游戏的具体代码,供大家参考,具体内容如下MyGameFrame类:主要的调用类package sc.wh
- 本文实例讲述了java实现切割wav音频文件的方法。分享给大家供大家参考,具体如下:import it.sauronsoftware.jav