要闻:java多线程之铁路售票系统

时间:2022-09-26 14:26:17       来源:互联网


(资料图)

本文实例为大家分享了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;  }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

关键词: java多线程售票系统 java售票系统 java铁路售票系统