需求:某電影院出售某些電影的票(復聯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();
}
}
}
}
}