Java教程

6.18Java多线程并发、同步练习DemoNo1

本文主要是介绍6.18Java多线程并发、同步练习DemoNo1,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

6.18Java多线程并发、同步练习DemoNo1

不和选择的线程数据安全

package iostudy.synchro;
​
/**
 * 多线程模拟影院选位置
 * @since JDK 1.8
 * @date 2021/6/18
 * @author Lucifer
 */
public class HappyCinema {
    public static void main(String[] args) {
​
        /*实例化资源类对象*/
        Cinema c = new Cinema(2, "Happy Game!");
​
        /*实例化代理对象*/
        new Thread(new Customer(c,2), "James").start();
        new Thread(new Customer(c,1), "Harden").start();
​
    }
}
​
/**
 * 内部资源类,定义资源属性和数量
 */
class Cinema{
​
    /*定义资源*/
    int available; //可用地位置
    String name; //位置名称
​
    /*构造器*/
    public Cinema(int available, String name){
        this.available = available;
        this.name = name;
    }
​
    /*购票方法*/
    public boolean bookTickets(int seats){
        System.out.println("可用位置为:" + available);
        /*逻辑判断*/
        if (seats > available) {
            return false;
        }
​
        available -= seats;
        return true;
​
    }
}
​
/**
 * 创建顾客类
 */
class Customer implements Runnable{
​
    /*传入资源类对象*/
    Cinema cinema;
    int seats;
​
    /*创建构造器*/
    public Customer(Cinema cinema, int seats){
        this.cinema = cinema;
        this.seats = seats;
    }
​
    /*重写run方法*/
    @Override
    public void run(){
         /*对影院对象加锁*/
        synchronized (cinema){
            boolean flag = cinema.bookTickets(seats); //传入位置判断是true还是false
            if (true){
                System.out.println("出票成功" + Thread.currentThread().getName()
                        + "位置为:" + seats);
            }else {
                System.out.println("出票失败!!!");
            }
        }
    }
}

使用容器控制,可选择座位号

package iostudy.synchro;
​
import java.util.ArrayList;
import java.util.List;
​
/**
 * 多线程模拟影院选位置
 * 加入可选位置功能--->利用容器实现
 * @since JDk 1.8
 * @date 2021/6/18
 * @author Lucifer
 */
public class HappyCinemaNo2 {
    public static void main(String[] args) {
​
        /*实例化容器可用的位置*/
        List<Integer> available = new ArrayList<Integer>();
​
        /*添加资源座位*/
        available.add(1);
        available.add(2);
        available.add(3);
        available.add(6);
        available.add(7);
​
        //需要的位置--->后期选择底层也是加入容器当中
        List<Integer> seats1 = new ArrayList<Integer>();
        seats1.add(1);
        seats1.add(2);
​
        List<Integer> seats2 = new ArrayList<Integer>();
        seats2.add(3);
        seats2.add(7);
        seats2.add(6);
​
        /*实例化资源类*/
        JunCinema j = new JunCinema(available, "HappyCinema");
​
        /*实例化代理类*/
        new Thread(new HappyCustomer(j, seats1), "JamesWilliam").start();
        new Thread(new HappyCustomer(j, seats2), "JamesHarden").start();
    }
}
​
/**
 * 资源类
 */
class HappyCustomer implements Runnable{
​
    /*实例化资源对象*/
    JunCinema cinema;
    List<Integer> seats;
​
    /*创建构造器*/
    public HappyCustomer(JunCinema cinema, List<Integer> seats){
        this.cinema = cinema;
        this.seats = seats;
    }
​
    /*重写run方法*/
    @Override
    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 JunCinema{
​
    /*创建资源*/
    List<Integer> available;
    String name;
​
    /*创建构造器*/
    public JunCinema(List<Integer> available, String name){
        this.available = available;
        this.name = name;
    }
​
    /**
     * 购票选座位方法
     */
    public boolean bookTickets(List<Integer> seats){
        System.out.println("可用位置为:" + available);
        /*两个容器的比较和操作--->做差比较判断是否可以返回*/
        //先拷贝一份原有资源
        List<Integer> copy = new ArrayList<Integer>();
        /*使用copy方法进行添加*/
        copy.addAll(available);
​
        //使用copy减掉座位
        copy.removeAll(seats); //修改指向
        //判断大小
        /*
        先拷贝位置,然后操作下面的位置
        available大小-copy的大小是否等于seats座位的大小
         */
        if (available.size()-copy.size() != seats.size()){
            /*返回失败*/
            return false;
        }
​
        //如果成功,直接赋值
        available = copy;
​
        return true;
    }
}

 

 

这篇关于6.18Java多线程并发、同步练习DemoNo1的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!