Вы можете рассмотреть возможность использования BlockingQueue, если вы можете ограничиться Java 5+.
Из документации по API Java с небольшим изменением использования ArrayBlockingQueue:
class Producer implements Runnable {
private final BlockingQueue queue;
Producer(BlockingQueue q) { queue = q; }
public void run() {
try {
while(true) { queue.put(produce()); }
} catch (InterruptedException ex) { ... handle ...}
}
Object produce() { ... }
}
class Consumer implements Runnable {
private final BlockingQueue queue;
Consumer(BlockingQueue q) { queue = q; }
public void run() {
try {
while(true) { consume(queue.take()); }
} catch (InterruptedException ex) { ... handle ...}
}
void consume(Object x) { ... }
}
class Setup {
void main() {
BlockingQueue q = new ArrayBlockingQueue();
Producer p = new Producer(q);
Consumer c1 = new Consumer(q);
Consumer c2 = new Consumer(q);
new Thread(p).start();
new Thread(c1).start();
new Thread(c2).start();
}
}
Для вашего использования ваш реальный отправитель (владелец фактического соединения) будет потребителем, а составители / отправители пакетов - производителями.
Интересной дополнительной мыслью является то, что вы могли бы использовать PriorityBlockingQueue, чтобы разрешить флэш-переопределение пакетов XMPP, отправляемых перед любыми другими ожидающими пакетами.
Кроме того, очки Глена на дизайне - хорошие моменты. Возможно, вы захотите взглянуть на Smack API (http://www.igniterealtime.org/projects/smack/), а не создавать свой собственный.