软件编程
位置:首页>> 软件编程>> java编程>> java多线程之铁路售票系统

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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com