В моем приложении у меня есть следующий повторяющийся паттерн, где я чувствую, что это неполная или искаженная версия какого-то общего паттерна, о котором я не знаю. В моей реализации я не могу найти хороший способ реализовать определенную операцию, как описано ниже.
Коллекция объектов, назовем их «источниками», создает данные, если вы вызываете для них метод. Экземпляр ScheduledThreadPoolExecutor (из <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html" rel="nofollow noreferrer">java.util.concurrent</a>
) используется для периодического чтения данных в источниках и помещения данных в общую исходящую очередь:
--o
method calls +-----+
--o <-- | o | ---> |||||||||||
--> | o o |
--o data +-----+
sources thread pool outbound queue
Источники, пул потоков и очередь являются членами класса, который предоставляет методы для добавления источников и получения заголовка очереди.
Ниже приведен код для добавления нового источника. Мне интересно, что произойдет, если я удалю источник из коллекции.
public void vAddSource(ISource src)
{
this._rgSources.add(src);
final ISource srcT = src;
// q is the outbound queue, which is a private member in the class
// defining this method. Name is abbreviated for readability
Runnable cmd = new Runnable() { public void run() { q.add(srcT.sRead()); } }
// tpx is the thread pool
this._tpx.scheduleAtFixedRate(cmd, 0L, 1000L, TimeUnit.MILLISECONDS);
}
Теперь, способ работы Java - если я понял это правильно - src и т. Д. - это идентификаторы объектов, которые передаются по значению, поэтому в приведенном выше коде есть только один объект ISource, и идентификатор для него добавляется в Коллекция, а также передается в пул потоков. Если я удаляю идентификатор из коллекции, объект все еще там, поэтому пул потоков будет продолжать читать из него, как будто ничего не произошло.
Я правильно понимаю? И какой будет типичный подход, если вы хотите, чтобы пул потоков принял к сведению удаление, а также отбросил источник?