java的多线程初体验
这里以车站售票作为模拟场景,多个票务人员同时出售某一列高铁(G250?)的车票,售票的基本保证有2点:
1、不能售出多于预定限额的车票。
2、不能售出具有相同座位的车票。
初学java,有不当的地方各位看官请指教~
代码如下:
package threadjava; public class ThreadTest4 { public static void main(String[] args) { // TODO 自动生成的方法存根 //限定总票数为100张 Seller seller = new Seller(100); //开放三个窗口售票 Worker w1 = new Worker(seller); Worker w2 = new Worker(seller); Worker w3 = new Worker(seller); } } //打印车票的机器,作为服务端可连接多个客户端运行使用 class Seller { private int[] tickets; private int sold_line; public Seller(int ticket_total) { this.tickets = getTickets(ticket_total); this.sold_line = ticket_total; } //该方法是个独占性方法,即同一时刻只允许一个线程调用 //也是java多线程进行同步操作的主要实现部分 public synchronized int sell() { if(this.sold_line != 0){ int ticket_pos = (int)(Math.random()*this.sold_line); int ticket = this.tickets[ticket_pos]; this.sold_line = this.sold_line - 1; swap(this.tickets, ticket_pos, this.sold_line); return ticket; }else{ return -1; } } private static void swap(int[] a, int x, int y){ int temp = a[x]; a[x] = a[y]; a[y] = temp; } private static void shfulle(int[] a) { int x, y; for(x=0; x<a.length; x++){ y = (int)(Math.random() * (x+1)); swap(a, x, y); } } private static int[] getTickets(int total){ int i; int[] a = new int[total]; for(i=0; i<total; i++){ a[i] = i; } shfulle(a); return a; } } //售票人员,被激活后就立即开始售票。哈哈,真是敬业~ class Worker extends Thread { private static int threadID = 0; private Seller tickor; public Worker(Seller seller) { super("Ticket Seller NO." + (++threadID)); this.tickor = seller; this.start(); } public void run() { while(true){ int ticket = this.tickor.sell(); if(ticket == -1){ System.out.println(this.getName() + ", sold out."); break; }else{ System.out.println(this.getName() + ", get ticket:" + ticket); } } } }
出票结果:
Ticket Seller NO.1, get ticket:59 Ticket Seller NO.1, get ticket:41 Ticket Seller NO.1, get ticket:67 Ticket Seller NO.2, get ticket:63 Ticket Seller NO.2, get ticket:87 Ticket Seller NO.2, get ticket:23 Ticket Seller NO.1, get ticket:80 Ticket Seller NO.2, get ticket:36 Ticket Seller NO.2, get ticket:20 Ticket Seller NO.3, get ticket:9 Ticket Seller NO.1, get ticket:6 Ticket Seller NO.3, get ticket:81 Ticket Seller NO.2, get ticket:82 Ticket Seller NO.3, get ticket:38 Ticket Seller NO.1, get ticket:19 Ticket Seller NO.3, get ticket:26 Ticket Seller NO.2, get ticket:1 Ticket Seller NO.3, get ticket:84 Ticket Seller NO.1, get ticket:51 Ticket Seller NO.3, get ticket:89 Ticket Seller NO.2, get ticket:31 Ticket Seller NO.3, get ticket:2 Ticket Seller NO.1, get ticket:34 Ticket Seller NO.3, get ticket:78 Ticket Seller NO.2, get ticket:11 Ticket Seller NO.3, get ticket:83 Ticket Seller NO.1, get ticket:73 Ticket Seller NO.3, get ticket:61 Ticket Seller NO.2, get ticket:56 Ticket Seller NO.3, get ticket:68 Ticket Seller NO.1, get ticket:16 Ticket Seller NO.3, get ticket:48 Ticket Seller NO.2, get ticket:18 Ticket Seller NO.3, get ticket:4 Ticket Seller NO.1, get ticket:49 Ticket Seller NO.1, get ticket:53 Ticket Seller NO.1, get ticket:85 Ticket Seller NO.1, get ticket:13 Ticket Seller NO.1, get ticket:57 Ticket Seller NO.3, get ticket:93 Ticket Seller NO.3, get ticket:42 Ticket Seller NO.3, get ticket:46 Ticket Seller NO.3, get ticket:44 Ticket Seller NO.3, get ticket:58 Ticket Seller NO.3, get ticket:70 Ticket Seller NO.3, get ticket:33 Ticket Seller NO.3, get ticket:76 Ticket Seller NO.3, get ticket:47 Ticket Seller NO.3, get ticket:92 Ticket Seller NO.3, get ticket:55 Ticket Seller NO.3, get ticket:75 Ticket Seller NO.3, get ticket:96 Ticket Seller NO.3, get ticket:77 Ticket Seller NO.3, get ticket:45 Ticket Seller NO.3, get ticket:28 Ticket Seller NO.3, get ticket:88 Ticket Seller NO.3, get ticket:72 Ticket Seller NO.3, get ticket:8 Ticket Seller NO.3, get ticket:10 Ticket Seller NO.3, get ticket:62 Ticket Seller NO.3, get ticket:24 Ticket Seller NO.3, get ticket:86 Ticket Seller NO.3, get ticket:97 Ticket Seller NO.3, get ticket:5 Ticket Seller NO.3, get ticket:21 Ticket Seller NO.3, get ticket:0 Ticket Seller NO.3, get ticket:7 Ticket Seller NO.3, get ticket:22 Ticket Seller NO.3, get ticket:54 Ticket Seller NO.3, get ticket:98 Ticket Seller NO.3, get ticket:95 Ticket Seller NO.3, get ticket:52 Ticket Seller NO.3, get ticket:66 Ticket Seller NO.3, get ticket:3 Ticket Seller NO.3, get ticket:50 Ticket Seller NO.3, get ticket:27 Ticket Seller NO.3, get ticket:40 Ticket Seller NO.3, get ticket:74 Ticket Seller NO.2, get ticket:25 Ticket Seller NO.2, get ticket:91 Ticket Seller NO.3, get ticket:94 Ticket Seller NO.3, get ticket:71 Ticket Seller NO.3, get ticket:65 Ticket Seller NO.3, get ticket:60 Ticket Seller NO.3, get ticket:29 Ticket Seller NO.3, get ticket:35 Ticket Seller NO.3, get ticket:90 Ticket Seller NO.3, get ticket:43 Ticket Seller NO.3, get ticket:39 Ticket Seller NO.3, get ticket:69 Ticket Seller NO.3, get ticket:37 Ticket Seller NO.3, get ticket:14 Ticket Seller NO.3, get ticket:99 Ticket Seller NO.3, get ticket:32 Ticket Seller NO.3, get ticket:12 Ticket Seller NO.3, get ticket:64 Ticket Seller NO.3, get ticket:30 Ticket Seller NO.3, get ticket:79 Ticket Seller NO.3, sold out. Ticket Seller NO.1, get ticket:15 Ticket Seller NO.1, sold out. Ticket Seller NO.2, get ticket:17 Ticket Seller NO.2, sold out.
参考文章:http://www.cnblogs.com/vamei/archive/2013/04/15/3000898.html
java的多线程初体验的更多相关文章
- Apache Beam入门及Java SDK开发初体验
1 什么是Apache Beam Apache Beam是一个开源的统一的大数据编程模型,它本身并不提供执行引擎,而是支持各种平台如GCP Dataflow.Spark.Flink等.通过Apache ...
- JAVA多线程-初体验
一.线程和进程 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程. 进程是所有线程的集合,每一个线程是进程中的一条执行路径. 二.为什么使用多线程,哪些场景下使用 多线程的好处是提高程序 ...
- 阿里云部署Java web项目初体验(转)/linux 上配置jdk和安装tomcat
摘要:本文主要讲了如何在阿里云上安装JDK.Tomcat以及其配置过程.最后以一个实例来演示在阿里云上部署Java web项目. 一.准备工作 购买了阿里云的云解析,和云服务器ecs. 2.下载put ...
- 阿里巴巴 Java 开发规约插件初体验
阿里巴巴 Java 开发手册 又一次来谈<阿里巴巴 Java 开发手册>,经过这大半年的版本迭代,这本阿里工程师们总结出来避免写出那么多 Bug 的规范,对于 Java 开发者简直就是必备 ...
- java画图之初体验
1.实现画图程序所需的API类 JFrame JButton ActionListener 动作事件接口 ActionEvent ...
- 阿里云部署Java web项目初体验(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了如何在阿里云上安装JDK.Tomcat以及其配置过程.最后以一个实例来演示在 ...
- java -ui自动化初体验
本文来讲一下ui自动化的环境搭建,以及最初级的打开网页操作 说起ui自动化,想想大概是前年的时候我开始接触和学习的吧,怎么说呢无论是pc还是app,ios还是android,确实很神奇而且很华丽,但是 ...
- 阿里云部署Java web项目初体验
林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了怎样在阿里云上安装JDK.Tomcat以及其配置过程. 最后以一个实例来演 ...
- 【阿里云产品公测】消息队列服务MQS java SDK 机器人应用初体验
[阿里云产品公测]消息队列服务MQS java SDK 机器人应用初体验 作者:阿里云用户啊里新人 初体验 之 测评环境 由于MQS支持外网访问,因此我在本地做了一些简单测试(可能有些业余),之后 ...
随机推荐
- iStat for mac
iStat for mac 电脑硬件信息检测软件,安装完成后它位于"系统偏好设定"的应用程序面板,让您从选单列监测系统的各项丰富资讯,又不会占用使用者太大的桌面空间,提供的信息包括 ...
- PHP中array_merge函数与array+array的区别
在PHP中可以使用array_merge函数和两个数组相加array+array的方式进行数组合并,但两者效果并不相同,下面为大家介绍两者具体的使用区别. 区别如下: 当下标为数值时,array_me ...
- python 之走坑的道路
### python之 继续走函数的坑 上篇文章简单介绍了函数的一些简单的使用,这次继续踩函数的坑1.函数对象 函数其实也可以当做一个参数传给另一个函数,也可以使用赋值的方式来给另一个,而且这两个的内 ...
- 第一天上午——HTML网页基础知识以及相关内容
今天上午学习了HTML基础知识以及相关内容,还有DW的基本使用方法. HTML(HyperText Markup Language):超文本标记语言,超文本:网页中除了包含文本文字之外,还包含了图片, ...
- Catalog Service - 解析微软微服务架构eShopOnContainers(三)
上一篇我们说了Identity Service,因为其基于IdentityServer4开发的,所以知识点不是很多,今天我们来看下Catalog Service,今后的讲解都会把不同的.重点的拿出来讲 ...
- nodeJS之流stream
前面的话 当内存中无法一次装下需要处理的数据时,或者一边读取一边处理更加高效时,我们就需要用到数据流.NodeJS中通过各种Stream来提供对数据流的操作.本文将详细说明NodeJS中的流strea ...
- 黑马程序员:3分钟带你读懂C/C++学习路线
随着互联网及互联网+深入蓬勃的发展,经过40余年的时间洗礼,C/C++俨然已成为一门贵族语言,出色的性能使之成为高级语言中的性能王者.而在今天,它又扮演着什么样重要的角色呢?请往下看: 后端服务器,移 ...
- Bash的条件表达式求值
Bash的条件控制允许两种类型:1)命令的成功或失败 2)逻辑表达式的真假这两种类型都可以通过退出状态($?)来检验,$?=0为真,否则为假 一.命令的成功或失败 通过查看$?值$echo $? 二. ...
- 【错误】undefined reference to `boost::....的解决
很多新手引用Boost库编程,在ubuntu下编译时候有时候会出现如下错误: test04.cpp:(.text+0x2c): undefined reference to `boost::progr ...
- python网络爬虫之使用scrapy自动爬取多个网页
前面介绍的scrapy爬虫只能爬取单个网页.如果我们想爬取多个网页.比如网上的小说该如何如何操作呢.比如下面的这样的结构.是小说的第一篇.可以点击返回目录还是下一页 对应的网页代码: 我们再看进入后面 ...