示例一:模拟在线购票
package com.aflfte.syn;
/**
* 快乐火车票
* @author root
*
*/
public class Happy12306 {
public static void main(String[] args) {
Web12306 web=new Web12306(2, "D1026");
new Passenger(2, web, "张三").start();
new Passenger(1, web, "李四").start();
}
}
class Passenger extends Thread{
int seats;
public Passenger(int seats,Runnable target,String name) {
super(target,name);
this.seats = seats;
}
}
class Web12306 implements Runnable{
int available;
String name;
public Web12306(int available, String name) {
super();
this.available = available;
this.name = name;
}
public synchronized boolean Gou(int seats) {
System.out.println("还有车票"+available+"张");
if(seats>available) {
return false;
}
available-=seats;
return true;
}
@Override
public void run() {
Passenger p=(Passenger)Thread.currentThread();
boolean flag=this.Gou(p.seats);
if(flag) {
System.out.println("购票成功!"+Thread.currentThread().getName()+"位置->"+p.seats);
}else {
System.out.println("购票失败,不好意思没票了");
}
}
}
//示例二模拟影院指定位置购票
package com.aflfte.syn;
import java.util.ArrayList;
import java.util.List;
/**
* 快乐影院
*
* @author root
*
*/
public class HappyCinema02 {
public static void main(String[] args) {
//影院位置
List<Integer> available=new ArrayList<Integer>();
available.add(1);
available.add(2);
available.add(3);
available.add(4);
available.add(5);
available.add(6);
available.add(7);
//张三需要的位置
List<Integer> seats=new ArrayList<Integer>();
seats.add(1);
seats.add(2);
//李四需要的位置
List<Integer> seats1=new ArrayList<Integer>();
seats1.add(3);
seats1.add(5);
seats1.add(6);
HiCinema c=new HiCinema(available, "happy cinema");
new Thread(new HappyCustormer(c, seats),"张三").start();
new Thread(new HappyCustormer(c,seats1),"李四").start();
}
}
//顾客
class HappyCustormer implements Runnable {
HiCinema cinema;
List<Integer> seats;
public HappyCustormer(HiCinema cinema, List<Integer> seats) {
super();
this.cinema = cinema;
this.seats = seats;
}
public void run() {
synchronized (cinema) {
boolean flag=cinema.bookTickets(seats);
if(flag) {
System.out.println("出票成功"+Thread.currentThread().getName()+"-->"+seats);
}else {
System.out.println("出票失败"+Thread.currentThread().getName()+"票数不够!");
}
}
}
}
//影院
class HiCinema{
List<Integer> available;//有多少位置
String name;
public HiCinema(List<Integer> available, String name) {
super();
this.available = available;
this.name = name;
}
//购票
public boolean bookTickets(List<Integer> seats) {
System.out.println("可用位置为:"+available+"个");
List<Integer> copy=new ArrayList<Integer>();
copy.addAll(available);
//相减
copy.removeAll(seats);
//判断大小
if(available.size()-copy.size()!=seats.size()) {
return false;
}
//成功
available=copy;
return true;
}
}
« 死锁的产生与解决方案
|
多线程安全同步(synchronized的使用方法)»
|