```I hope it's not too late for a new submission!

So, when I first read this quiz, it didn't seem like enough of a
challenge. Immediately, I wondered if someone would come up with a
threaded answer, but then everyone started playing golf, and I got a bit
caught up in that...

Well, since no one did go for the threaded solution (and since I needed
to brush up on my threading skills anyway), I give you THE THREADED

#!/usr/bin/env ruby -w

require 'monitor'

def initialize
@counting = 1
@fizz_went = false
@buzz_went = false
@numbers_went = false
@done_counting = false
@output = ''
@output.extend(MonitorMixin)
end

def fizz
loop do
@output.synchronize do
if !@fizz_went && !@buzz_went && !@numbers_went
@output << 'Fizz' if @counting%3 == 0
@fizz_went = true
end
end
break if @done_counting && @fizz_went
end
end
end

def buzz
loop do
@output.synchronize do
if @fizz_went && !@buzz_went && !@numbers_went
@output << 'Buzz' if @counting%5 == 0
@buzz_went = true
end
end
break if @done_counting && @buzz_went
end
end
end

def numbers
loop do
@output.synchronize do
if @fizz_went && @buzz_went && !@numbers_went
@output << @counting.to_s unless (@counting%3 == 0 ||
@counting%5 == 0)
@numbers_went = true
end
end
break if @done_counting && @numbers_went
end
end
end

def count_upto(i)
loop do
@output.synchronize do
if @fizz_went && @buzz_went && @numbers_went
@output << "\n"
@counting += 1
@done_counting = true if @counting >= i
@fizz_went = false
@buzz_went = false
@numbers_went = false
end
end
break if @done_counting
end
end
end

def start_counting_upto(i)