I am working on a practical scenario related with Java;a socket program. The existing system and the expected system are as follows.
Existing System – The system checks that a certain condition is satisfied. If so It will create some message to be sent and put it into a queue.
The queue processor is a separate thread. It periodically check the queue for existence of items in it. If found any items (messages) it just sends the message to a remote host (hardcoded) and remove the item from queue.
Expected System – This is something like that. The message is created when a certain condition is satisfied but in every case the recipient is not same. So there are many approaches.
-
putting the message into the same queue but with its receiver ID. In this case the 2nd thread can identify the receiver so the message can be sent to that.
-
Having multiple threads. In this case when the condition is satisfied and if the receiver in “New” it creates a new queue and put the message into that queue. And a new thread initializes to process that queue. If the next messages are directed to same recipient it should put to the same queue and if not a new queue and the thread should be created.
Now I want to implement the 2nd one, bit stucked. How should I do that? A skeleton would be sufficient and you won’t need to worry to put how to create queues etc… 🙂
Update : I also think that the approach 1 is the best way to do that. I read some articles on threading and came to that decision. But it is really worth to learn how to implement the approach 2 as well.
First of all, if you are planning to have a lot of receivers, I would not use the ONE-THREAD-AND-QUEUE-PER-RECEIVER approach. You could end up with a lot of threads not doing anything most of the time and I could hurt you performance wide. An alternative is using a thread pool of worker threads, just picking tasks from a shared queue, each task with its own receiver ID, and perhaps, a shared dictionary with socket connections to each receiver for the working threads to use.
Having said so, if you still want to pursue your approach what you could do is:
1) Create a new class to handle your new thread execution:
2) On your main thread, create the messages and use a dictionary (hash table) to see if the receiver’s threads is already created. If is is, the just queue the new message. If not, create a new thread, put it in the hashtable and queue the new message:
Good luck.
Edit: you can improve this solution by using BlockingQueue Brian mentioned with this approach.