>>447
雰囲気だけですが、こんな感じです。
それぞれのスレッドは1つのファイルをダウンロードするのに専念させてます。
require 'net/http'; Net::HTTP.version_1_2
require 'uri'
require 'set'
def download url
 uri = URI(url); http = Net::HTTP.new(uri.host, uri.port)
 http.request_get(uri.path + '?' + uri.query) {|res|
  open(出力ファイル名, 'wb') {|out|
   res.read_body {|chunk| out.write chunk}
  }
 }
end
thr_set = Set[] # ダウンロード中スレッドを入れるためのSet
N = 5 # スレッドの最大個数
[ダウンロードするURL].each {|url|
 sleep(1) until thr_set.size < N # スレッドの個数が多すぎなくなるまで寝る
 thr_set << Thread.start {
  download url # ダウンロード
  thr_set.delete Thread.current # 終わったらSetから削除
 }
}
thr_set.each {|thr| thr.join} # メインスレッドが終了しないように、稼働中のスレッドを待つ