Рецепт: как подождать завершения всех порождённых потоков исполнения

И очень просто: нужно в основном (порождающем) потоке подождать получения данных на «вещательном» канале столько же раз, сколько «вещающих» в этот канал потоков мы породили.
Это чем-то похоже на телефонную конференцию: вы ждёте, пока все остальные участники попрощаются (при этом можете не вдаваться в подробности того, кто именно отсалютовал) — и вешаете трубку.

Собственно код:

begin
	ch=Channel(Int32).new
	fibCount=0
	i : Int32
	10.times{|i|
		fibCount+=1
		spawn do
			r=Random.new
			nsec=Random.rand*5.0
			puts "№#{i} launched, will sleep #{nsec}"
			sleep nsec
			puts "№#{i} sleeped #{nsec}, will send its ID to channel"
			ch.send(i)
			puts "№#{i} sended its name to channel, now finishing..."
		end
	}
	
	fibCount.times{
		i=ch.receive
		puts "main: received message from fiber №#{i}"
	}
	
	puts "main: sleeping 1 second"
	sleep 1
	puts "main: Congratulations! Thats DONE!"
rescue ex
	puts "EXCEPTION: #{ex.message}"
end

0 комментариев