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,售票系统
0
投稿

猜你喜欢

  • Android异步消息机制详解

    2023-08-07 09:42:52
  • idea创建SpringBoot项目时Type选maven project和maven pom有何区别

    2023-07-04 07:20:27
  • 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
  • Java_异常类(错误和异常,两者的区别介绍)

    2023-09-19 08:53:27
  • 分享Java常用开发编辑器工具

    2023-11-06 07:35:37
  • Java面试synchronized偏向锁后hashcode存址

    2023-08-09 09:15:06
  • spring定义和装配bean详解

    2023-08-23 00:33:18
  • flutter日期选择器 flutter时间选择器

    2023-09-22 04:50:15
  • Android 动画之TranslateAnimation应用详解

    2023-06-27 06:17:59
  • Struts2实现文件上传功能实例解析

    2023-11-04 04:56:13
  • synchronized背后的monitor锁实现详解

    2023-07-31 08:14:10
  • 详解Spring依赖注入的三种方式使用及优缺点

    2023-06-09 18:29:00
  • c#中CAD文件读取实例

    2023-07-23 19:37:59
  • asp之家 软件编程 m.aspxhome.com