多線程模擬售票

需求:某電影院出售某些電影的票(復聯3,紅高粱....),有三個窗口同時進行售票(100張票),請您設計一個程序,模擬電影院售票
兩種方式:
繼承
接口
(1)synchronized實現
public class SellTicketDemo {

public static void main(String[] args) {

//創建資源類對象(共享資源類/目標對象)
    SellTicket st = new SellTicket() ;

    //創建線程類對象
    Thread t1 = new Thread(st, "窗口1") ;
    Thread t2 = new Thread(st ,"窗口2") ;
    Thread t3 = new Thread(st, "窗口3") ;
    //啓動線程
    st1.start();
    st2.start();
    st3.start();
}

}
public class SellTicket implements Runnable {

//定義100張票
private int tickets = 100 ;

private Object obj = new Object() ;

@Override
public void run() {
    while(true) {

        //new Object():鎖對象 (門和關)
        //t1,t2,t3
        synchronized(obj) {//t1進來,門一關,t2,t3進不來了
            if(tickets>0) {
                try {
                    //睡眠:延遲
                    Thread.sleep(100); 
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()
                        +"正在出售第"+(tickets--)+"張票");//0,-1
            }
        }

    }
}

}
(2)Lock實現
//測試類
public class SellTicketDemo {

public static void main(String[] args) {

    SellTicket st = new SellTicket() ;

    Thread t1 = new Thread(st,"窗口1") ;
    Thread t2 = new Thread(st,"窗口2") ;
    Thread t3 = new Thread(st,"窗口3") ;
    //啓動線程
    t1.start(); 
    t2.start(); 
    t3.start();
}

}
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class SellTicket implements Runnable {

// 定義票
private int tickets = 100;
// Object obj = new Object();

// Jdk5.0以後,java提供了一個具體的鎖: 接口:Lock
private Lock lock= new ReentrantLock(); //顯示獲取鎖的前提,一定要創建Lock接口對象

@Override
public void run() {
    while (true) {
        try { //try...finally
            lock.lock(); // 獲取鎖    syncrhonized(obj)
            if (tickets > 0) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println(Thread.currentThread().getName() + "正在出售第" + (tickets--) + "張票");
            }

        } finally {//釋放鎖
            if(lock!=null) {
                lock.unlock();
            }

        }

    }

}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章