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

先定义类型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. iOS第三方支付集成

    支付宝(alipay)和微信支付(Wechat Pay) 支付宝: 一.总体流程 (1)先与支付宝签约.获得商户ID(partner)和账号ID(seller)(注冊app⽤用) (2)下载对应的公钥 ...

  2. APICloud 实践 —— 手机端预览项目

    上一次讲到如何创建一个应用,今天讲下如何在手机端预览项目. 1.下载 AppLoader 下载地址:https://docs.apicloud.com/Download/download#apploa ...

  3. Loadrunner中Error-26612HTTP Status-Cod

    最近在测试一系统的时候,录制脚本没有错误,回放的时候总是出现如下错误: Action.c(6): Error -26612: HTTP Status-Code=500 (Internal Server ...

  4. C++中构造函数,拷贝构造函数和赋值函数的区别和实现

    C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象 ...

  5. 使用Eclipse的JUnit实例

    在本节中,我们将展示使用JUnit的一个完整的例子.我们将详细了解如何创建和运行测试,我们将展示如何使用特定的注释和JUnit断言. 1. 初始步骤 让我们创建一个名为 JUnitGuide 的Jav ...

  6. e799. 限制JSlider的数值在标记以内

    By default, the slider can take on any value from the minimum to the maximum. It is possible to conf ...

  7. e777. 获得JList组件的所有项

    // Create a list String[] items = {"A", "B", "C", "D"}; JLis ...

  8. Lua--------------------unity3D与Slua融合使用

    下载与安装 下载地址 GitHub 安装过程 1.下载最新版,这里, 解压缩,将Assets目录里的所有内容复制到你的工程中,对于最终产品,可以删除slua_src,例子,文档等内容,如果是开发阶段则 ...

  9. CI框架 -- 核心文件 之 config.php

    Config:该文件包含CI_Config类,这个类包含启用配置文件来管理的方法 /** * 加载配置文件 * * @param string $file 配置文件名 * @param bool $u ...

  10. js jquery 按钮点击后 60秒之后才能点击 60秒倒计时

    var wait = 60; function time(o) { if (wait == 0) { $(o).attr("disabled", false); $(o).val( ...