Оказывается, я немного заново изобрел колесо.То, что я действительно хотел сделать, можно сделать намного проще с помощью Java ScheduledExecutorService.
class CommunicationControl
{
private final ScheduledExecutorService scheduluer = Executors.newScheduledThreadPool(1);
public void startManager()
{
final CommunicationManager manager = new CommunicationManager();
scheduler.scheduleAtFixedRate(manager, 10, 1, SECONDS);
}
public void stopManager()
{
while (manager.getMessageCount() > 0)
{
try
{
Thread.sleep(manager.getMessageCount() * 1000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
scheduler.shutdown();
}
}
Переработка исходного класса здесь:
class CommunicationManager implements Runnable
{
private BlockingQueue<Message> message = new ArrayBlockingQueue<Message> (1000);
private Messenger messenger = new Messenger();
public CommunicationManager() {}
public void run()
{
Message next = message.poll();
if (next != null)
{
next.getSender().recieve(messenger.send(next.getMessage()));
}
}
public void addMessage(Sender sender, String message)
{
try
{
while (!this.message.offer(new Message(sender, message), 1, TimeUnit.SECONDS)) {}
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
Что это будет делать, это сначала создатьисполнитель для управления частотой запуска моего Communication Manager, который в этом случае выполняется один раз в секунду с задержкой в 10 секунд.Затем, как только это происходит каждую секунду, метод Run CommuncationManager будет выполнять, выполняя ровно одну единицу работы, если она доступна.
Другие методы могут добавлять работу в CommunicationManager, если есть место в очереди, в противном случае они будутблокировать, пока пространство не станет доступным.
Это также освобождает меня от возможности встроить это в среду, такую как Spring.