zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Python基本命名规范
    复制当前文件夹下所有文件的名称
    Java中返回类型方法名
    BugFree 测试管理系统
    jmeter+badboy免费测试
    Linux的命令
    C语言
    linux基础知识点以及安装
    JMeter安装教程
    linux 操作命令
  • 原文地址:https://www.cnblogs.com/Leo-Forest/p/3208290.html
Copyright © 2011-2022 走看看