I see a few problems. First I can't see how the threads can ever end, they'll be stuck in that while(true) loop forever. There maybe some code missing but you need to make sure you can break out of that loop to allow the thread to exit properly.
Secondly, if you add more threads than there are cores on a processor then you won't gain any performance increase because while some threads will be running others will be waiting for their time on the processor. It could actually slow you down.
So what you may want to do is create a fixed number of threads as soon as you start (you should be able to use
Environment.ProcessorCount
to get the number of threads that can run in parallel) and then if your queue starts to get full you will simply have to stop adding items to it until there is enough room.
EDIT: Forgot to mention, you may also want to look into using a Thread Pool if your going to be creating lots of threads on the fly
http://msdn.microsoft.com/en-us/library/3dasc8as(v=vs.80).aspx[
^]