2

メインスレッドが終了する前に、すべてのスレッドが実行されるのを待つ良い方法を見つけようとしています。

次のコードでそれを行うにはどうすればよいですか?

    threads = []

    counter = 1000

    lines = 0

    counter.times do |i|
      puts "This is index number #{i}."
    end

    puts "You've just seen the normal printing and serial programming.\n\n"

    counter.times do |i|
      Thread.new do
        some_number = Random.rand(counter)
        sleep 1
        puts "I'm thread number #{i}. My random number is #{some_number}.\n"
        lines += 1
      end
    end

    messaged = false
    while lines < 1000
      puts "\nWaiting to finish.\n" unless messaged
      print '.'
      puts "\n" if lines == 1000
      messaged = true
    end

    puts "\nI've printed #{lines} lines.\n"
    puts "This is end of the program."

プログラムは私がスレッド番号XXXです。私の乱数は、メインスレッドのほぼ最後にあるwhileループのドットとYYYで混合されています。whileループを使用しない場合、プログラムはスレッドが終了する前に終了します。

4

2 に答える 2

3

子が終了するまで親を待機させるには、 join を使用します

 threads = []
 counter.times do |i|
    thr = Thread.new do
            some_number = Random.rand(counter)
            sleep 1
            puts "I'm thread number #{i}. My random number is #{some_number}.\n"
            lines += 1
    end
    threads << thr
  end
  threads.each {|thread| thread.join }
于 2012-08-22T13:15:17.567 に答える
1

スレッドを「結合」できるように、スレッドへの参照を保持する必要があります。何かのようなもの:

counter.times.map do |i|
  Thread.new do
    # thread code here
  end
end.each{|t| t.join}
于 2012-08-22T14:08:38.510 に答える