Ruby Thread Condition Variables【转】

原文:http://garyli.iteye.com/blog/1779332

require 'monitor'

SONGS = [
    'Blue Suede Shoes',
    'Take Five',
    'Bye Bye Love',
    'Rock Around The Clock',
    'Ruby Tuesday'
]
START_TIME = Time.new

def timestamp
    (Time.now - START_TIME).to_i
end

# Wait for up to two minutee between customer requests
def get_customer_request
    sleep(120 * rand)
    song = SONGS.shift
    puts "#{timestamp}: Requesting #{song}" if song
    song
end

# Songs take between two and three minutes
def play(song)
    puts "#{timestamp}: Playing #{song}"
    sleep(120 + 60*rand)
end

ok_to_shutdown = false
# and here's our original code

playlist = []
playlist.extend(MonitorMixin)
plays_pending = playlist.new_cond

# Customer request thread
customer = Thread.new do
    loop do
        req = get_customer_request
        puts req
        break unless req
        playlist.synchronize do
            playlist << req
            plays_pending.signal
        end
    end
end

# Player Thread
player = Thread.new do
    loop do
        song = nil
        playlist.synchronize do
            break if ok_to_shutdown && playlist.empty?
            plays_pending.wait_while {playlist.empty?}
            song = playlist.shift
        end
        break unless song
        play(song)
    end
end

customer.join
ok_to_shutdown = true
player.join

 

转载于:https://www.cnblogs.com/Leo-Forest/p/3208290.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值