日志文章

2019-12-26 aflfte2011

并发模拟示例

示例一:模拟在线购票
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的使用方法)»