老问题:模拟一个售票窗口进行售票

先定义类型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之并发处理(售票问题)的更多相关文章

  1. C# Entity Framework并发处理

    原网站:C# Entity Framework并发处理 在软件开发过程中,并发控制是确保及时纠正由并发操作导致的错误的一种机制.从 ADO.NET 到 LINQ to SQL 再到如今的 ADO.NE ...

  2. JAVA多线程售票问题

    //定义一个类实现Runnable接口,定义一个需要同步的售票方法,然后重写run方法调用售票的sale方法 class SaleTicket implements Runnable{ private ...

  3. WCF 的 Service Instance模式和并发处理

    WCF 的 Service Instance(实例)有三种模式 PerCall:每一次调用都创建一个实例,每一次调用结束后回收实例.此模式完全无状态. PerSession:调用者打开Channel时 ...

  4. COGS247. 售票系统[线段树 RMQ]

    247. 售票系统 ★★☆   输入文件:railway.in   输出文件:railway.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 某次列车途经C个城市,城市 ...

  5. Android线程之并发处理

    上一篇为大家介绍了关于Looper的简单知识,本篇我们介绍一下多线程的并发处理,我们知道Handler通过sendMessage()发送的消息,首先发送给了Looper,存入Looper的消息栈,之后 ...

  6. java 22 - 11 多线程之模拟电影院售票口售票

    使用多线程实现的第二种方式: 首先创建自定义类 public class SellTicket implements Runnable { // 定义100张票 private int ticket ...

  7. 三、基础功能模块,用户类别管理——锁、EF并发处理、领域服务、应用服务的划分

    在上一章节中,我们处理了MVC多级目录问题,参见<二.处理MVC多级目录问题——以ABP为基础架构的一个中等规模的OA开发日志>.从这章开始,我们将进入正式的开发过程.首先,我们要完成系统 ...

  8. 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) ...

  9. 事务并发处理: DB+ORM+逻辑代码

    在学习了马士兵有关事务并发处理的视频后, 感觉对事务并发处理的概念,问题以及解决方式有了一定的了解,赶紧记录下来以备后用. 1. 事务:一系列操作要么都完成,要么一个都不完成 2. 事务并发:多个事务 ...

随机推荐

  1. android开发(45) 自定义软键盘(输入法)

    概述 在项目开发中遇到一个需求,”只要数字键盘的输入,仅仅有大写字母的输入,某些输入法总是会提示更新,弹出广告等“,使得我们需要自定义输入. 关联到的知识 KeyboardView      一个视图 ...

  2. .NET中常见加解密算法

    一.MD5不可逆加密 不可逆加密是指将原文加密成密文以后,无法将密文解密成原文. MD5的算法是公开的,无论是哪种语言,只要需要加密的字符串是相同的,那么经过MD5加密以后生成的结果都是一样的. .N ...

  3. v8是怎么实现更快的 await ?深入理解 await 的运行机制

    最近v8团队发表一篇博客Faster async functions and promises, 预计在v7.2版本实现更快的异步函数和promise. 文章内容看起来不是很容易理解,背后的原理比较隐 ...

  4. .net操作oracle,一定要用管理员身份运行 visual studio 啊,切记切记,免得报奇怪的错误。

    .net操作oracle,一定要用管理员身份运行 visual studio 啊,切记切记,免得报奇怪的错误.

  5. office 2013 快速换KEY

    在有些时候,我们总会碰到一些需要更换Office安装Key(序列号.密钥)的情形,例如购买或朋友赠了新的Key等等.网上搜索的话,有很多种更改变换Office 2010序列号办法,今天就来挨个介绍一下 ...

  6. 函数式编程——C#理解

    转自:http://www.cnblogs.com/xiaozhi_5638/p/4762846.html 目录 一个问题 函数式编程中的函数 数学与函数式编程 混合式编程风格 一个问题 假设现在我们 ...

  7. activity 与 fragment生命周期

    一.Activity的生命周期图: 二.Fragment生命周期图 三.对比图 Log数据 Activity﹕    onCreateFragment﹕ onAttachFragment﹕ onCre ...

  8. MD5骨骼动画模型加载(一)

    前面我们分析了静态模型OBJ格式,桢动画模型MD2,这篇主要分析骨骼动画MD5的一些概念并且实现. 混合桢动画有计算简单,容易实现等优点,但是在需要比较细致的效果时,则需要更多的关键桢,每桢都添加相同 ...

  9. Numpy的array数组和标量之间的运算

    矢量化 数组很重要,因为它使你不用编写循环即可对数据执行批量运算.这通常就叫做矢量化(vectorzation) 数组与数组的运算 数组与标量的算术运算

  10. 第一个shell程序

    前言:我为什么又来学习shell呢?因为这个轻量级的编程小脚本语言能够帮我处理一些基于linux的复杂手工工作.真是一言难尽,学会一门又来一门!! 看了2天这个教程,试着写了一个小脚本,没啥技术含量, ...