Go之并发处理(售票问题)
老问题:模拟一个售票窗口进行售票
先定义类型Ticket(车票)和Conductor(销售员)--偷懒了,把售票和产票都交给Conductor了
package util import () //--------------------------------
type Ticket struct {
ID int
Price string
Type string
} //--------------------------------
type Conductor struct {
Tickets []Ticket
Count int
} func NewConductor() *Conductor {
return &Conductor{make([]Ticket, 0), 0}
} func (this *Conductor) Sell() Ticket { temp := this.Tickets[0]
this.Tickets = this.Tickets[1:] return temp } func (this *Conductor) Product() Ticket {
ticket := Ticket{this.Count + 1, "$18", "成人票"}
this.Count = this.Count + 1
this.Tickets = append(this.Tickets, ticket)
return ticket
}
func main() {
conductor := util.NewConductor() ticketCount := 100 temp := make(chan int, 100) wg := new(sync.WaitGroup)
wg.Add(ticketCount * 2) //一个线程产票,一个线程售票
for i := 0; i < ticketCount; i++ { go func() {
defer wg.Done()
<-temp
fmt.Println("出售:", conductor.Sell())
}()
}
for i := 0; i < ticketCount; i++ { go func() {
defer wg.Done()
temp <- i
fmt.Println("生产:", conductor.Product())
}()
} wg.Wait()
}
输出结果
出售: {1 $18 成人票}
生产: {2 $18 成人票}
出售: {2 $18 成人票}
生产: {3 $18 成人票}
出售: {3 $18 成人票}
生产: {4 $18 成人票}
出售: {4 $18 成人票}
生产: {5 $18 成人票}
出售: {5 $18 成人票}
生产: {6 $18 成人票}
出售: {6 $18 成人票}
生产: {7 $18 成人票}
出售: {7 $18 成人票}
生产: {8 $18 成人票}
出售: {8 $18 成人票}
生产: {9 $18 成人票}
出售: {9 $18 成人票}
生产: {10 $18 成人票}
出售: {10 $18 成人票}
生产: {11 $18 成人票}
出售: {11 $18 成人票}
生产: {12 $18 成人票}
出售: {12 $18 成人票}
生产: {13 $18 成人票}
出售: {13 $18 成人票}
生产: {14 $18 成人票}
出售: {14 $18 成人票}
生产: {15 $18 成人票}
出售: {15 $18 成人票}
生产: {16 $18 成人票}
出售: {16 $18 成人票}
生产: {17 $18 成人票}
出售: {17 $18 成人票}
生产: {18 $18 成人票}
出售: {18 $18 成人票}
生产: {19 $18 成人票}
出售: {19 $18 成人票}
生产: {20 $18 成人票}
出售: {20 $18 成人票}
生产: {21 $18 成人票}
出售: {21 $18 成人票}
生产: {22 $18 成人票}
出售: {22 $18 成人票}
生产: {23 $18 成人票}
出售: {23 $18 成人票}
生产: {24 $18 成人票}
出售: {24 $18 成人票}
生产: {25 $18 成人票}
出售: {25 $18 成人票}
生产: {26 $18 成人票}
生产: {1 $18 成人票}
出售: {26 $18 成人票}
生产: {27 $18 成人票}
生产: {28 $18 成人票}
出售: {27 $18 成人票}
生产: {29 $18 成人票}
生产: {30 $18 成人票}
出售: {28 $18 成人票}
生产: {31 $18 成人票}
生产: {32 $18 成人票}
出售: {29 $18 成人票}
生产: {33 $18 成人票}
生产: {34 $18 成人票}
出售: {30 $18 成人票}
生产: {35 $18 成人票}
出售: {31 $18 成人票}
生产: {36 $18 成人票}
生产: {37 $18 成人票}
出售: {32 $18 成人票}
生产: {38 $18 成人票}
生产: {39 $18 成人票}
出售: {33 $18 成人票}
出售: {34 $18 成人票}
生产: {40 $18 成人票}
生产: {41 $18 成人票}
出售: {35 $18 成人票}
出售: {36 $18 成人票}
生产: {42 $18 成人票}
生产: {43 $18 成人票}
出售: {37 $18 成人票}
出售: {38 $18 成人票}
生产: {44 $18 成人票}
生产: {45 $18 成人票}
出售: {39 $18 成人票}
出售: {40 $18 成人票}
生产: {46 $18 成人票}
生产: {47 $18 成人票}
出售: {41 $18 成人票}
出售: {42 $18 成人票}
生产: {48 $18 成人票}
生产: {49 $18 成人票}
出售: {43 $18 成人票}
出售: {44 $18 成人票}
生产: {50 $18 成人票}
生产: {51 $18 成人票}
出售: {45 $18 成人票}
出售: {46 $18 成人票}
生产: {52 $18 成人票}
生产: {53 $18 成人票}
出售: {47 $18 成人票}
出售: {48 $18 成人票}
生产: {54 $18 成人票}
生产: {55 $18 成人票}
出售: {49 $18 成人票}
出售: {50 $18 成人票}
生产: {56 $18 成人票}
生产: {57 $18 成人票}
出售: {51 $18 成人票}
出售: {52 $18 成人票}
生产: {58 $18 成人票}
生产: {59 $18 成人票}
出售: {53 $18 成人票}
出售: {54 $18 成人票}
生产: {60 $18 成人票}
生产: {61 $18 成人票}
出售: {55 $18 成人票}
出售: {56 $18 成人票}
生产: {62 $18 成人票}
生产: {63 $18 成人票}
出售: {57 $18 成人票}
出售: {58 $18 成人票}
生产: {64 $18 成人票}
生产: {65 $18 成人票}
出售: {59 $18 成人票}
出售: {60 $18 成人票}
生产: {66 $18 成人票}
生产: {67 $18 成人票}
出售: {61 $18 成人票}
出售: {62 $18 成人票}
生产: {68 $18 成人票}
生产: {69 $18 成人票}
出售: {63 $18 成人票}
出售: {64 $18 成人票}
生产: {70 $18 成人票}
生产: {71 $18 成人票}
出售: {65 $18 成人票}
出售: {66 $18 成人票}
生产: {72 $18 成人票}
生产: {73 $18 成人票}
出售: {67 $18 成人票}
出售: {68 $18 成人票}
生产: {74 $18 成人票}
出售: {69 $18 成人票}
出售: {70 $18 成人票}
生产: {75 $18 成人票}
生产: {76 $18 成人票}
出售: {71 $18 成人票}
出售: {72 $18 成人票}
生产: {77 $18 成人票}
生产: {78 $18 成人票}
出售: {73 $18 成人票}
出售: {74 $18 成人票}
生产: {79 $18 成人票}
生产: {80 $18 成人票}
出售: {75 $18 成人票}
出售: {76 $18 成人票}
生产: {81 $18 成人票}
生产: {82 $18 成人票}
出售: {77 $18 成人票}
出售: {78 $18 成人票}
生产: {83 $18 成人票}
生产: {84 $18 成人票}
出售: {79 $18 成人票}
出售: {80 $18 成人票}
生产: {85 $18 成人票}
生产: {86 $18 成人票}
出售: {81 $18 成人票}
出售: {82 $18 成人票}
生产: {87 $18 成人票}
生产: {88 $18 成人票}
出售: {83 $18 成人票}
出售: {84 $18 成人票}
生产: {89 $18 成人票}
生产: {90 $18 成人票}
出售: {85 $18 成人票}
出售: {86 $18 成人票}
生产: {91 $18 成人票}
生产: {92 $18 成人票}
出售: {87 $18 成人票}
出售: {88 $18 成人票}
生产: {93 $18 成人票}
生产: {94 $18 成人票}
出售: {89 $18 成人票}
出售: {90 $18 成人票}
生产: {95 $18 成人票}
生产: {96 $18 成人票}
出售: {91 $18 成人票}
出售: {92 $18 成人票}
生产: {97 $18 成人票}
出售: {93 $18 成人票}
出售: {94 $18 成人票}
出售: {95 $18 成人票}
生产: {98 $18 成人票}
出售: {96 $18 成人票}
生产: {99 $18 成人票}
出售: {97 $18 成人票}
生产: {100 $18 成人票}
出售: {98 $18 成人票}
出售: {99 $18 成人票}
出售: {100 $18 成人票}
Go之并发处理(售票问题)的更多相关文章
- C# Entity Framework并发处理
原网站:C# Entity Framework并发处理 在软件开发过程中,并发控制是确保及时纠正由并发操作导致的错误的一种机制.从 ADO.NET 到 LINQ to SQL 再到如今的 ADO.NE ...
- JAVA多线程售票问题
//定义一个类实现Runnable接口,定义一个需要同步的售票方法,然后重写run方法调用售票的sale方法 class SaleTicket implements Runnable{ private ...
- WCF 的 Service Instance模式和并发处理
WCF 的 Service Instance(实例)有三种模式 PerCall:每一次调用都创建一个实例,每一次调用结束后回收实例.此模式完全无状态. PerSession:调用者打开Channel时 ...
- COGS247. 售票系统[线段树 RMQ]
247. 售票系统 ★★☆ 输入文件:railway.in 输出文件:railway.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 某次列车途经C个城市,城市 ...
- Android线程之并发处理
上一篇为大家介绍了关于Looper的简单知识,本篇我们介绍一下多线程的并发处理,我们知道Handler通过sendMessage()发送的消息,首先发送给了Looper,存入Looper的消息栈,之后 ...
- java 22 - 11 多线程之模拟电影院售票口售票
使用多线程实现的第二种方式: 首先创建自定义类 public class SellTicket implements Runnable { // 定义100张票 private int ticket ...
- 三、基础功能模块,用户类别管理——锁、EF并发处理、领域服务、应用服务的划分
在上一章节中,我们处理了MVC多级目录问题,参见<二.处理MVC多级目录问题——以ABP为基础架构的一个中等规模的OA开发日志>.从这章开始,我们将进入正式的开发过程.首先,我们要完成系统 ...
- python_way day10 python和其他语言的作用域 、 python2.7多继承和3.5多继承的区别 、 socket 和 socketserver源码(支持并发处理socket,多进程,多线程)
python_way day10 1.python的作用域和其他语言的作用域 2.python2.7多继承和3.5多继承的区别 3.socket和socketserver源码(并发处理socket) ...
- 事务并发处理: DB+ORM+逻辑代码
在学习了马士兵有关事务并发处理的视频后, 感觉对事务并发处理的概念,问题以及解决方式有了一定的了解,赶紧记录下来以备后用. 1. 事务:一系列操作要么都完成,要么一个都不完成 2. 事务并发:多个事务 ...
随机推荐
- Git教程首页
Git 教程 Git 是一个分布式的版本控制和源代码管理系统,强调速度. Git 最初由Linus Torvalds设计和开发为Linux内核开发管理代码. Git是GNU通用公共许可证版本2的条款下 ...
- 解决IDEA 中git 无法自动push 提交问题 Push failed: Failed with error: Could not read from remote repository.
Push failed: Failed with error: Could not read from remote repository.
- R语言文件相关的操作
1. 文件系统介绍 R语言对文件系统的操作,包括文件操作和目录操作,函数API都定义在base包中. 2. 目录操作 2.1 查看目录 查看当前目录下的子目录. # 启动R程序 ~ R # 当前的目录 ...
- android Toast大全(五种情形)建立属于你自己的Toast
Toast用于向用户显示一些帮助/提示.下面我做了5中效果,来说明Toast的强大,定义一个属于你自己的Toast. 1.默认效果 代码 Toast.makeText(getApplicationCo ...
- Android WiFi 日志记录(四次握手)
记录一下四次握手的log. PMK: PMK(Pairwise Master Key,成对主密钥 STA和AP得到PMK后,将进行密匙派生以得到PTK.最后,PTK被设置到硬件中, 用于数据的加解密. ...
- 第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies
第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录 模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于star ...
- HTML5实现摇一摇的功能(实测后)--转
eviceMotionEvent(设备运动事件)返回设备有关于加速度和旋转的相关信息.加速度的数据将包含三个轴:x,y和z(示意如下图所 示,x轴横向贯穿手机屏幕或者笔记本键盘,y轴纵向贯穿手机屏幕或 ...
- Java如何处理已检查异常?
在Java编程中,如何处理已检查异常? 此示例显示如何使用catch块处理已检查的异常. package com.yiibai; public class HandleCheckedException ...
- Maven构建自动化
构建自动化定义相关工程项目构建过程中,在当项目构建成功完成启动的情况下,来确保所依赖的项目是稳定的. 实例 考虑一个团队正在开发一个项目总线核心API上的其他两个项目的应用程序:网页UI和应用程序的桌 ...
- e831. 从JTabbedPane中删除一个卡片
// To create a tabbed pane, see e828 创建JTabbedPane // Remove the last tab pane.remove(pane.getTabCou ...