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支持外网访问,因此我在本地做了一些简单测试(可能有些业余),之后 ...
随机推荐
- 关于Laravel中的artisan命令
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Helvetica; color: #454545 } p.p2 { margin: 0.0p ...
- React学习小结(二)
一.组件的嵌套 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...
- 前端教你学UI——人物处理(一)
一.序言 本文作为本系列的第一篇写UI的文章,开头还是有必要申明一些东西的,本系列主要是为了作为博主在前端工作之余学习UI的一个记录,同时为了让更多的同行学习到一些编程之外的其他东西.所以本文会尽可能 ...
- netty基础--基本收发
使用maven构建一个基本的netty收发应用,作为其他应用的基础.客户端使用packet sender工具. 1 添加netty依赖 1 maven netty依赖 <dependency ...
- javascript基础-语法
代表此属性ECMAScript 5(一般IE9+)才支持. 图解:—— 图解: undefined,null,NaN Infinity ECMAScript 5禁止修改 每个函数都是Function的 ...
- 对 dotweb 框架进行统一的自定义错误处理
助移动端的增长,如今 RESTful 风格的 API 已经十分流行, 用各种语言去写后端 API 都有很成熟方便的方案,用 golang 写后端 API 更是生产力的代表, 你可以用不输 python ...
- dotnet 命令实战
以下用实例串起dotnet所有命令,带你玩转dotnet命令. 1.创建(dotnet new) 首先我们创建一个项目,这里我们创建控制台程序,命令如下图所示. dotnet new dotnet n ...
- Vue爬坑之vuex初识
在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用 props 或者 $emit 等方式 http://www.cnblogs.com/wisewrong/p/62660 ...
- Python 基于TK 文本编辑器
#coding=utf-8 import sys,os import tkFileDialog from Tkinter import * from tkFont import Font print ...
- .NET中使用Redis总结
注:关于如何在windows,linux下配置redis,详见这篇文章:) 启动遇到问题 使用命令[redis-server.exe redis.windows.conf],启动redis 服务[如果 ...