У меня есть вопрос об использовании runnable для работы в singleton.Как использовать runnable для работы в Singleton?
У меня есть класс EventCoordinator, который является одноточечным, потому что он обрабатывает все события (и потому, что мое назначение требует от меня этого). События будут добавлены к этому координатору и будут обработаны позже. События должны обрабатываться в другом потоке, в котором запуск принимает события очереди и обрабатывает их. метод start должен начать новый поток, который принимает события очереди с помощью run.
final public class EventCoordinator implements Runnable {
protected final static EventCoordinator coordinator = new EventCoordinator();
protected static LinkedList<QueueItem> queue = new LinkedList<QueueItem>();
private EventBroker() {
}
private class QueueItem {
protected Event event;
public QueueItem(Event event) {
this.event = event;
}
}
public static EventCoordinator getEventCoordinator() {
return coordinator;
}
public void addEventObserver(EventObserver o) {
//adds listeners to the coordinator
}
void addEvent(EventPublisher source, Event e) {
QueueItem queueItem = new QueueItem(e, source);
synchronized(this) { queue.add(queueItem); }
}
public void run() {
// Process items from the queue
}
public void start() {
// start a new thread that processes items of the queue
}
}
Но, как я понимаю runnables, что при создании thread = new Thread(New EventCoordinator)
вы создаете новый объект EventCoordinator и, таким образом, не работают на одной и той же очереди больше. Итак, как вы можете использовать runnable для выполнения этой работы в очереди? Я старую статическую очередь? Я реализую методы для добавления и удаления элементов из очереди и вызываю их в координаторе, возвращаемом getEventCoordinator?
1) Используйте «BlockingQueue». 3) избавиться от всех «синхронизированных» блоков. 3) Вы в основном сделаны. –
Почему вы не можете просто «thread = new Thread (coordinator)»? – OldCurmudgeon
@Deb Какой ответ вы выбрали как лучший? Не могли бы вы найти решение? – Saidolim