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;
    }

}

猜你喜欢

转载自blog.csdn.net/qq_41264055/article/details/81259315