2017-10-11 4 views
-2

私は今、私は、メソッドsay_helloを実行するクラスをしているし、そこRubyのスレッドを持つクラスの内部でメソッドを実行するにはどうすればよいですか?

class Person 
    attr_accessor :name 
    def say_hello 
    puts "person name #{self.name} " 
    end 
end 

を属性が、このスレッド

queue_thread= [] 
1..100.times do |number| 
    person= Person.new 
    person.name= number.to_s 
    thread_to_run=Thread.new {person.say_hello} 
    queue_thread << thread_to_run 
end 
queue_thread.map {|thread_current| thread_current.join} 

と、あなたはそれを行う方法いくつかのアイデアを持っていますか?私は見て、proplemはスレッドよりもオブジェクトのインスタンスによってvarsの認識ではありません。

の答えが正しい、これは

"person name 1" 
"person name 2" 
"person name ..." 
"person name etc" 
+0

あなたはどうなりますか?同時に複数のスレッドをコンソールに書き込むことは、物事を混乱させる良い方法です。 1つのスレッドが出力を処理する必要があります。 – tadman

+0

答えをありがとう、私は再び編集し、私は人の名前1、人の名前2、人の名前3をコンソールで取得する必要があります。手伝っていただけませんか ? –

+0

これが必要な場合は、スレッドが混乱することになります。なぜあなたは物事を貫通していますか?何らかの形で出力を収集し、表示する前にソートする必要があります。 – tadman

答えて

0

コンソールにする必要がありますこのコードの問題は、それがjoinを呼び出す前に、複数のスレッドをオフに発射することである - この時点では、スレッドの一部を呼び出すことができ間違った順序で、スレッドの非同期性のために。

1つのオプションは、スレッドが呼び出されるとただちにjoinになります。スレッドが完了するまで、これが実質的に反復を一時停止しますので、あなたは彼らが順番に滞在されます知っている:

100.times do |number| 
    person= Person.new 
    person.name= number.to_s 
    Thread.new {person.say_hello}.join 
end 

注意がここにスレッドを使用するにはポイントは本当にありませんが、それは意志、少なくともショーあなたはjoinをすることができます働く

もう1つのオプション(スレッドを不必要に使用する)は、スレッド呼び出しをラムダとして保存することによってスレッドの呼び出しを遅延させます。これは、基本的には同じものですが、2回の反復にそれを分割することができます:

queue_threads= [] 
1..100.times do |number| 
    person= Person.new 
    person.name= number.to_s 
    thread_lambda = -> { Thread.new {person.say_hello} } 
    queue_threads.push(thread_lambda) 
end 
queue_threads.map {|thread_lambda| thread_lambda.call.join} 

はまた1..100.timesは、あなたがそれだと思う何をやっていないことに注意してください。 100.timesと同じことです。たとえば、99..100.timesと言った場合、99は無視され、1だけでなく100回の反復回数になります。範囲を反復処理する場合は、99..100.each do |i|などを使用できます。

関連する問題