功能实现:多线程模拟售票系统

定义一个车票类,车票类拥有票号属性、  车票状态(未售、售出)属性和拥有者(String类型)属性;在主线程中定义一个票库(ArrayList数组列表)初始化票库并生产200张票;

定义一个乘客类继承自线程类,有一个名字(String类型)属性, 乘客类每隔10毫秒就去票库中查看有没票,如果有票就抢一张过来 (把车票标为售出状态,并把车票的拥有者标为自己的名字), 每个乘客抢到20张票就停止运行。

在主线程中创建10个乘客类并启动它们(开始抢票), 要求每个乘客抢到的票不连号,不能多抢或少抢。抢完后打印出每个人抢到的票号。

代码实现部分:

import java.util.ArrayList;

public class Main {

static ArrayList mTicketList = new ArrayList();//票库

public static void main(String[] args) {

for(int i=0;i<200;i++){

Ticket t = new Ticket();

t.ticketNum = i + 100;

mTicketList.add(t);

}

Passenger[] passengers = new Passenger[10];

for(int i=0;i<10;i++){

passengers[i] = new Passenger("passenger_"+i/*,mTicketList*/);

passengers[i].start();

}

//等待所有乘客结束

for(int i=0;i<10;i++){

try {

passengers[i].join();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

for(int i=0;i

System.out.print(passengers[i].name+"抢到的票:");

int tCnt = 0; //抢到的票数

for(int j=0;j

Ticket t = mTicketList.get(j);

if(t != null && t.owner != null && passengers[i] != null){

if(t.owner.equals( passengers[i].name)){

tCnt++;

System.out.print(t.ticketNum+",");

}

}

}

System.out.println("总票数:"+tCnt);

}

}

}

import java.util.ArrayList;

public class Passenger extends Thread {

String name;//名字

//ArrayList mTicketList ;

int myTickets = 0;

public Passenger(String name/*,ArrayList ticketList*/){

//mTicketList = ticketList;

this.name = name;

}

@Override

public void run() {

//Main.mTicketList.get(0);

while(myTickets<20){

//开始抢票

for(int i=0;i

Ticket t = Main.mTicketList.get(i); //取出第i张票

synchronized (t) { //synchronized (监视的竞争对象)

if(t.saledState == Ticket.STATE_NOT_SALED){

t.saledState = Ticket.STATE_SALED; //把车票标为售出状态

t.owner = this.name; //把车票的拥有者标为自己的名字

myTickets++;

System.out.println(this.name +"抢到"+t.ticketNum+"号票");

break;

}

}

/*

boolean result = checkTicket(t);

if(result){

break;

}*/

}

try {

sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

/*

* synchronized 默认监视的竞争对象 : 为当前类对象,即this

*/

public synchronized boolean checkTicket(Ticket t){

if(t.saledState == Ticket.STATE_NOT_SALED){

t.saledState = Ticket.STATE_SALED; //把车票标为售出状态

t.owner = this.name; //把车票的拥有者标为自己的名字

myTickets++;

System.out.println(this.name +"抢到"+t.ticketNum+"号票");

return true;

}

return false;

}

}

public class Ticket {

public static final boolean STATE_SALED = true; //售出状态

public static final boolean STATE_NOT_SALED = false;//未售出状态

public int ticketNum = 0; //票号

public boolean saledState = STATE_NOT_SALED;//车票状态

public String owner = null; //拥有者

}

java 多线程抢票_多线程抢票详解相关推荐

  1. java io字符输出流_灵魂一击!详解Java中的IO输入输出流

    什么是流?流表示任何有能力产生数据的数据源对象或者是有能力接收数据的接收端对象,它屏蔽了实际的I/O设备中处理数据的细节. IO流是实现输入输出的基础,它可以很方便地实现数据的输入输出操作,即读写操作 ...

  2. java基础代码实例_基础篇:详解JAVA对象实例化过程

    1 对象的实例化过程 对象的实例化过程是分成两部分:类的加载初始化,对象的初始化 要创建类的对象实例需要先加载并初始化该类,main方法所在的类需要先加载和初始化 类初始化就是执行方法,对象实例化是执 ...

  3. java 内存 开发 经验_七年开发经验详解JVM的GC 算法

    概述 GC 是 JVM 自带的功能,它能够自动回收对象,清理内存,这是 Java 语言的一大优势,但是GC绝不仅伴随着Java,相反,GC历史比Java更悠久.关于GC,我认为有四个问题需要解决: 为 ...

  4. 操作系统之多线程编程—读者优先/写者优先详解

    操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...

  5. 深入浅出多线程编程实战(五)ThreadLocal详解(介绍、使用、原理、应用场景)

    深入浅出多线程编程实战(五)ThreadLocal详解(介绍.使用.原理.应用场景) 文章目录 一.ThreadLocal简介 二.ThreadLocal与Synchronized区别 三.Threa ...

  6. java path类_基于java Files类和Paths类的用法(详解)

    Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream; import java.nio.file.FileSystem ...

  7. java中sleep()、wait()相同与不同详解

    java中sleep().wait()相同与不同详解 相同 java中Thread#sleep和Object#wait方法都是暂停当前线程,当前线程让出CPU占用.并不存在调用sleep后还占用CPU ...

  8. java加密算法入门(三)-非对称加密详解

    1.简单介绍 这几天一直在看非对称的加密,相比之前的两篇内容,这次看了两倍多的时间还云里雾里的,所以这篇文章相对之前的两篇,概念性的东西多了些,另外是代码的每一步我都做了介绍,方便自己以后翻阅,也方便 ...

  9. java文件流 m.jb51.net_FasfDFS整合Java实现文件上传下载功能实例详解

    今天使用Java代码实现文件的上传和下载.对此作者提供了Java API支持,下载fastdfs-client-java将源码添加到项目中.或者在Maven项目pom.xml文件中添加依赖 org.c ...

  10. python对输入的字符串进行解析_python数据类型_字符串常用操作(详解)

    这次主要介绍字符串常用操作方法及例子 1.python字符串 在python中声明一个字符串,通常有三种方法:在它的两边加上单引号.双引号或者三引号,如下: name = 'hello' name1 ...

最新文章

  1. Protocol Buffer Java应用实例
  2. php 之 在win10-64 上搭建开发环境
  3. cocos2dx 坐标系统详解
  4. 试分析下列程序段:请选择(L1、L2、L3或L4)填入相应的括弧中
  5. nodejs项目_多人群聊实现其实很简单:Nodejs+WebSocket+Vue轻松实现Web IM
  6. 韩信大招:一致性哈希
  7. 如何快速获取properties中的配置属性值
  8. C++中函数重载、缺省参数及命名空间
  9. ifconfig源代码-NetBSD
  10. 云服务器 ECS 搭建WordPress网站:备案
  11. Windows10临时关闭数字签名认证
  12. MineCraft note
  13. Restlet 学习笔记
  14. 机械制图计算机识图,机械制图基础知识
  15. java foxpro,在Visual FoxPro中更新顶部
  16. 浏览器事件:为什么会有捕获过程和冒泡过程?
  17. 虚拟机是什么?有什么用
  18. 习题8-14 商队抢劫者(Caravan Robbers, ACM/ICPC SEERC 2005, UVa1616)
  19. 『R语言Python』使用logging、log4r写日志
  20. 高博14讲:第七讲中g20报错

热门文章

  1. 【python-bug】日期正则表达式 unbalanced parenthesis at position 64
  2. Android 一个美观简洁的登录界面(一)
  3. word文档中如何添加目录
  4. element.style样式如何修改
  5. 《手把手教你构建自己的 Linux 系统》学习笔记(9)
  6. Android音视频基础知识
  7. win10资源管理器explorer总是崩溃重启
  8. 招商银行笔试题之爱吃喵粮的小招喵
  9. [非线性控制理论]5_自适应控制器(Adaptive controller)
  10. Android快捷开关实现 Wifi开关、蓝牙开关、GPS开关、同步开关、亮度设置开关