Java多线程学习——例子:模拟电影院抢座位
Cinema——List<Integer>数据结构存储电影院座位
public class Cinema{
    private List<Integer> seats;  //剩余座位
    public Cinema(List<Integer> seats) {
        this.seats = seats;
    }
    public boolean seatGrabbing(List<Integer> needTickets){
        if(needTickets.size()>seats.size()){
            return false;
        }
        synchronized (this) {
            if(needTickets.size()>seats.size()){
                return false;
            }
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("剩余座位:" + seats);
            List<Integer> tmpSeats=new ArrayList<Integer>();
            tmpSeats.addAll(seats);
            tmpSeats.removeAll(needTickets);
            if(seats.size()-tmpSeats.size()==needTickets.size()){
                seats=tmpSeats;
                return true;
            }else {
                return false;
            }
        }
    }
}
CinemaCustomer
public class CinemaCustomer implements Runnable {
    private List<Integer> needTickets;    //需要的票
    private Cinema cinema;
    private boolean isGetTickets=false;
    public CinemaCustomer(List<Integer> needTickets, Cinema cinema) {
        this.needTickets = needTickets;
        this.cinema = cinema;
    }
    @Override
    public void run() {
        isGetTickets=cinema.seatGrabbing(needTickets);
        if(isGetTickets){
            System.out.println(Thread.currentThread().getName()+"抢票成功"+needTickets);
        }else{
            System.out.println("抢票失败"+needTickets);
        }
    }
}
GrabbingTickets
public class GrabbingTickets {
    public static void main(String[] args) {
        List<Integer> seats=new ArrayList<Integer>();   //总座位
        seats.add(1);
        seats.add(2);
        seats.add(3);
        seats.add(4);
        seats.add(5);
        Cinema cinema=new Cinema(seats);
        List<Integer> seat1=new ArrayList<Integer>();
        seat1.add(1);
        seat1.add(2);
        List<Integer> seat2=new ArrayList<Integer>();
        seat2.add(5);
        seat2.add(4);
        new Thread(new CinemaCustomer(seat1,cinema),"Tom").start();
        new Thread(new CinemaCustomer(seat2,cinema),"Job").start();
    }
}
很简单的一个例子,但是体会到了线程同步,也学会使用容器的一些常用方法。
Java多线程学习——例子:模拟电影院抢座位的更多相关文章
- Java多线程学习(转载)
		Java多线程学习(转载) 时间:2015-03-14 13:53:14 阅读:137413 评论:4 收藏:3 [点我收藏+] 转载 :http://blog ... 
- java多线程学习笔记——详细
		一.线程类 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ... 
- 【转】Java多线程学习
		来源:http://www.cnblogs.com/samzeng/p/3546084.html Java多线程学习总结--线程概述及创建线程的方式(1) 在Java开发中,多线程是很常用的,用得好的 ... 
- Java多线程学习(四)等待/通知(wait/notify)机制
		转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79690279 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ... 
- 转:Java多线程学习(总结很详细!!!)
		Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程 ... 
- Java多线程学习(吐血超详细总结)
		Java多线程学习(吐血超详细总结) 林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实 ... 
- [转]Java多线程学习(总结很详细!!!)
		Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程 ... 
- Java多线程学习笔记
		进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ... 
- JAVA多线程学习笔记(1)
		JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ... 
随机推荐
- docker安装配置mongodb
			1 执行 docker search mongo 命令: 2 运行mongo docker run --name mongo -v /mnt/mongodb:/data/db -p 27017:270 ... 
- JavaScript精进篇
			JavaScript是所有前端框架中最基础的框架,在工作了两年以后又重新回到了这里.过去两年里用的最多的前端框架是jquery,因为它简单易上手,而jquery就是封装了JavaScript.重新系统 ... 
- oracle基本语句(第四章、数据库安全管理)
			1.用SYS用户以SYSDBA身份登录SQL Plus,使用DBA_USERS视图查看用户信息: SELECT USERNAME, ACCOUNT_STATUS, CREATED FROM DBA_U ... 
- python 习题
			文件内容为一个多层元组,遍历该元组,当全为数字时输出数字之和,全为字母输出字符串,有数字有字母输出False,并将该内容写入到该文件的下一行中 # 方法一: t1= ((1,2,3),("a ... 
- springmvc/springboot开发restful API
			非rest的url写法: 查询 GET /user/query?name=tom 详情 GET /user/getinfo? 创建 POST /user/create?name=tom 修改 POST ... 
- C#内存占用释放
			序言 系统启动起来以后,内存占用越来越大,使用析构函数.GC.Collect什么的也不见效果,后来查了好久,找到了个办法,就是使用 SetProcessWorkingSetSize函数.这个函数是Wi ... 
- 【转】jqprint打印时自定义页眉页脚
			需求:自定义页眉,实现打印时分页时每页页眉都显示相同的信息 打印所用插件jqprint 解决方法: <div class="divHeader"> <span s ... 
- week3 作业
			1.Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示. 1.1 创建文件 touch FILE mkdir DIR mkdir -p DIR1/DIR2/DIR3/ 递归创建子目 ... 
- 1.Python编程基础
			1. 其实,程序指的就是一系列指令,用来告诉计算机做什么,而编写程序的关键在于,我们需要用计算机可以理解的语言来提供这些指令. 虽然借助 Siri(Apple).Google Now(Android) ... 
- [LeetCode]-009-Palindrome_Number
			Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could negativ ... 
