Ruby线程(二)

      熟悉线程的朋友应该对经典的售票员卖票程序不陌生。全国各地有很多售票点同时发售车票,车票在这里作为一个公用的资源,各地的售票中心访问资源,打印车票给顾客。我们来看一下ruby实现这个简单功能的代码吧:

# 线程-买票实例
class Ticket
  attr_reader :ticket
  attr_reader :value
  def initialize
    @ticket = %w(a b c d e f g h i j k l m n o p q r s t u v w x y z)
    @value = 0
  end

  def buy_ticket
    @k = @ticket
    if @k.empty?
      puts "no result"
      @value +=1
    else
      sleep(3*rand)
      puts "the ticket is #{@k.last} "
      sleep(3*rand)
      @value +=1
      puts "OK #{@value}"
      @ticket.pop
      puts "**************分隔符******************"
    end
  end
end


a = Ticket.new
t1 = Thread.new { 10.times {puts "线程1" ; a.buy_ticket  } }
t2 = Thread.new { 10.times { puts "线程2"; a.buy_ticket  } }
t3 = Thread.new { 10.times { puts "线程3"; a.buy_ticket  } }
t1.join
t2.join
t3.join

      我们开了3个线程分别表示不同的3个售票点同事发售车票,我们在发售车票的时候使用了sleep来模拟工作人员操作的时间。

 @ticket = %w(a b c d e f g h i j k l m n o p q r s t u v w x y z)

      @ticket这个数组用来表示一组车票。好我们来运行这个程序,看能看到什么结果

线程1线程2线程3





the ticket is z 

OK 1

**************分隔符******************

线程3

the ticket is y 

the ticket is y 

the ticket is y 

OK 2

**************分隔符******************

线程2

OK 3

**************分隔符******************

线程1

OK 4

**************分隔符******************

线程3

the ticket is v 

the ticket is v 

the ticket is v 

OK 5

      我们可以看见,有的车票被多个窗口同时卖出,当然这在规定当中是不允许的。这个是为什么呢?我们来看一下程序。乍一看是肯定没有什么问题的。细细想想,假设我们的线程1进入卖票程序,并查看到当前可以买y票。线程1睡眠一段时间,假设这段时间正好线程2进来了,并执行了卖票程序,此时线程1并未实际意义上的把票卖了出去,这就导致了两个线程卖出了同一张票。

       那么有没有解决办法呢?比如说,在线程1进入程序的时候,就把票给锁死了,这样线程2来的时候就不能对该张票进行操作。在ruby当中有个监视器monitor可是实现该功能。我们对买票这个操作进行监视控制,只能同时一个人来操作。好吧,我们来看一下下面的代码:

# 线程-买票实例
require 'monitor'
class Ticket
  attr_reader :ticket
  attr_reader :value
  def initialize
    @ticket = %w(a b c d e f g h i j k l m n o p q r s t u v w x y z)
    @value = 0
  end

  def buy_ticket
    @k = @ticket
    if @k.empty?
      puts "no result"
      @value +=1
    else
      sleep(3*rand)
      puts "the ticket is #{@k.last} "
      sleep(3*rand)
      @value +=1
      puts "OK #{@value}"
      @ticket.pop
      puts "**************分隔符******************"
    end
  end
end


a = Ticket.new
k = Monitor.new
t1 = Thread.new { 10.times {k.synchronize{puts "线程1" ; a.buy_ticket  }} }
t2 = Thread.new { 10.times {k.synchronize{puts "线程2" ; a.buy_ticket  }} }
t3 = Thread.new { 10.times {k.synchronize{puts "线程3" ; a.buy_ticket  }} }
t1.join
t2.join
t3.join

puts a.value

      我们使用了监视器来对资源进行监视,不能同时由多个线程进行操作,避免重复卖票的情况,这中间的核心部分就是如下所示:

 

k = Monitor.new
t1 = Thread.new { 10.times {k.synchronize{puts "线程1" ; a.buy_ticket  }} }
t2 = Thread.new { 10.times {k.synchronize{puts "线程2" ; a.buy_ticket  }} }
t3 = Thread.new { 10.times {k.synchronize{puts "线程3" ; a.buy_ticket  }} }

     当然,我们可以不对该操作进行监视,我们对票据资源进行监视。也会使用到synchronize。这里就不再赘述,想知道的可以参考programming ruby。

     好拉。今天就写这么多吧。o(∩_∩)o...哈哈

LLaMA Factory添加新模型template的实战解析 本文主要介绍了LLaMA Factory添加新模型template的实战解析,希望对使用大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 实战解析 2.1 检查代码 2.2 修改代码 阅读详情

相关推荐

智能汽车竞赛摄像头处理(4)——摄像头循迹思路讲解

智能汽车竞赛摄像头处理(4)对摄像头循迹思路进行讲解。

weixin_62261692的博客 7057

Ruby编程线程池案例二详解

本例可以观察到线程池tg.freeze前后的状态

临风暖阳的博客 173

银河麒麟服务器(ky10 server)arm、x86安装qemu虚拟机

接下来就可以新建服务器了。

zengliguang的专栏 8709

Ruby中式编程之线程二及代码行级优化

def 姜修艳 陈翔宇=0 while 陈翔宇<=2 puts “姜修艳 at: #{Time.now}” sleep(2) 陈翔宇=陈翔宇+1 end end def 周慧慧 陈鸿玮=0 while 陈鸿玮<=2 puts “周慧慧 at: #{Time.now}” sleep(1) 陈鸿玮=陈鸿玮+1 end end puts “开始于 #{Time.now}” 陈元才=Thread.new{姜修艳()} 陈鹏飞=Thread.new{周慧慧()} 陈元才.join 陈鹏飞.join pu.

临风暖阳的博客 252

Unity Android构建报错:compileSdk 35兼容性五层定位法

Android构建中的compileSdk是编译时API目标版本,其升级并非孤立操作,而是触发JDK、Android Gradle Plugin(AGP)、NDK、targetSdk与Unity引擎版本之间强耦合校验的起点。当出现'using a newer Android Gradle plugin to use compileSdk = 35'类报错,本质是代际技术栈错配——例如AGP 7.1.3不识别compileSdk 35所需Java 17语法,或NDK 21与AGP 7.4的ABI规范冲突。该问

weixin_32496547的博客 568

[cshell]个性化配置你的cshrc/tcshrc

本文介绍了csh/tcsh shell的配置优化方法,主要包括:1. 配置文件管理(全局和个人配置);2. 按键绑定设置(解决远程登录按键问题);3. 提示符个性化(包含颜色配置方案);4. 环境变量设置(如LSCOLORS、CLICOLOR等);5. 安全防护措施(防误删、防覆盖等);6. 实用alias命令集(简化操作、提高效率)。文章提供了详细的配置示例,并建议通过man tcsh获取更多帮助信息。这些配置能显著提升shell使用体验和工作效率。

元直的博客 6112

Ruby语言的多线程编程

线程是程序中执行的最小单元,它是在进程中运行的一条执行路径。每个线程都有自己的栈空间和局部变量,但它们共享同一进程的内存空间。多个线程可以并发执行,从而实现更高效的资源利用。

2501_90407275的博客 1522

SAPGUI excel 导出时遇到的运行时错误:STRING_SIZE_TOO_LARGE

当报表导出需求远超单一 XLSX 文件的物理承载力时,与其在 SAPGUI 中硬拼 2 GB 限制,不如把分页、过滤、流式写入作为设计前提。掌握 ABAP2XLSX 或 CSV + Power Query 等工具链,既能满足审计合规,又能让应用服务器远离的噩梦。祝你在下一次导出海量数据时,既高效又优雅。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 639

ruby 线程id_Ruby中的线程

ruby 线程id Ruby线程 (Ruby Threads) In Ruby, with the help of threads, you can implement more than one process at the same time or it can be said that Thread supports concurrent programming model. Apart f...

cumtb2002的博客 411

Python和Spyder:一个完美的编程组合

而Spyder作为一个专门为科学计算和数据分析而设计的IDE,提供了高效的开发环境和丰富的工具。无论是初学者还是专业开发者,Python和Spyder都能满足他们的需求,并为他们的工作带来便利和效率。本文将探讨Python和Spyder之间的关系,以及它们如何相互配合,提供一流的编程体验。每个工具都有其特定的优势和适用场景,开发者可以根据自己的需求选择合适的工具。而Spyder作为一个专门为科学计算而设计的IDE,提供了编写、调试和执行Python代码的环境。

CodeHeroicX的博客 1123

【技能】OpenClaw Memory 与 MemOS 两种 AI 记忆方案深度解析

摘要:本文对比了两种AI记忆系统方案。OpenClaw Memory是轻量级记忆助手,内置SQLite存储,支持语义搜索,部署简单成本低,适合日常对话记忆需求。MemOS是自学习系统,通过Neo4j和Qdrant实现技能自进化,但需部署4套服务,门槛高成本大。建议普通用户选择OpenClaw Memory,技术玩家可逐步尝试MemOS。两种方案各具优势,需根据实际需求选择。

海兰 195

ruby多线程_Ruby中的多线程

ruby多线程 Ruby多线程 (Ruby Multithreading) If we talk about a normal program in Ruby, all statements are executed sequentially because it used to have a single thread commonly known as the main thread. But...

cumubi7552的博客 556

2021-10-29【微生物】丨基于qiime2工具16S/ITS分析全套流程(上)

目录摘要工具与方法使用命令结果展示总结二级目录三级目录 摘要 前两个月项目特别多,最近终于有机会闲下来写点文章,把之前搭建的流程梳理一遍。前同事分析16S/ITS使用的qiime1,我接手后感觉不太适应,希望能够使用新版本来搭建,于是花了几天时间重新搭了这个流程, 工具与方法 使用工具:qiime2 使用版本:qiime2-2021.4 参考文档:https://docs.qiime2.org/2021.4/(最新版本2021.8) 使用命令 在这里插入代码片 结果展示 总结 二级目录 三级目录 ...

1万+

ruby线程控制,线程同步

在Ruby中线程是用户级线程并依赖与操作系统。线程是进程中的一个实体,是被系统独立调度和分配的基本单位。线程可以与同属于同样个进程的其他线程共同共享进程的全部资源。但是线程不拥有资源,只需要一点在运行时必不可少的资源。 线程的基本控制,如果主进程结束,会结束所有的线程。所以如果你的线程在执行显示的任务,但是主进程却已经执行完毕,会看不到线程的任何输出。如链接中所示: http://bl

Work Hard, Play Harder! 5153

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Ruby学习之多线程的使用方式

每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是程序中一个单一的顺序控制流程,在单个程序中同时运行多个线程完成不同的工作,称为多线程。Ruby 中我们可以通过 Thread 类来创建多线程,Ruby的线程是一个轻量级的,可以以高效的方式来实现并行的代码,来看下启动一个新的线程的代码格式: # 线程 #1 代码部分 Thread.new { # 线程 #2 执行代码 }...

luyaran的博客 2793

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: Intype 下载
下一篇: Myeclipse下使用svn进行源码管理
refactaar
博客等级 码龄17年 0粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值