I happen to be working on a multi-threaded server project as well. I have my main class (with entry point) and an rServer class that extends Thread. Each time a socket connection is made to the server socket a new rServer thread is fired up to handle it. One thing I wanted to do is be able to enumerate all of the client threads (class rServer) from my main class so I could yield() or whatever I wanted to do to those. I don't see why, in your situation, you couldn't store outputstreams or even the rServer objects themselves:
1. I created a new class called rServerRegistrar. It has 3 public methods void registerThread(Thread), void deregisterThread(Thread), and Thread[] getClientThreads().
2. In my main class I create an instance of rServerRegistrar and PASS THE INSTANCE TO EACH rServer OBJECT. Note that I can not just create a new instance of the registrar object in rServer (Maybe if I made it a static class I could. Is there such a thing as a static class???).
3. In the run() method of my rServer object, the first action is to register the thread rServerRegistrar.registerThread(this);
Now, in my main class, or rServer class, at any point I can use the method rServerRegistrar.getClientThreads() to get an array of Threads.
One problem I ran into was that if clients disconnected without issuing the correct command on the server, it would not properly deregister, so there would be threads returned that were not active, so in my getClientThreads() method I had to do some clean-up. I tried Thread.isActive(), but this doesn't seem to work. Still working on this problem.
rynox