Запуск многопоточного класса в качестве демона - PullRequest
0 голосов
/ 15 мая 2009

Я пишу многопоточное решение на Java для соединения двух систем A и B. Система A является полностью последовательной, а не многопоточной, и будет предоставлять данные для отправки в систему B. Система B принимает данные из нескольких источников асинхронно, все в то же время.

Я использую ThreadPoolExecutor для управления потоками. Я использую статический одноэлементный экземпляр класса TP, который обтекает ThreadPoolExecutor (который также является статическим), потому что система A не может создавать новые объекты, но может выполнять вызовы статических объектов.

Вот где я застрял. Я делаю очень простое тестирование установки, прежде чем изо всех сил. Я создал два класса для тестирования, T1 и T2. Каждый из этих классов импортирует класс TP (где создается статический синглтон). T1 добавляет некоторые объекты в очередь TP, а затем T2 добавляет еще несколько.

Несмотря на то, что объект TP объявлен как статический, похоже, что в параллельной версии работают две версии. Объекты, переданные в очередь T2, выполняются до того, как все объекты, представленные T1, будут выполнены. Кроме того, поскольку ни T1, ни T2 не вызывают shutdown () в ThreadPoolExector, они оба зависают и никогда не завершаются.

Как я могу создать статический экземпляр демона протектора, который в основном просыпается, когда я отправляю что-то для обработки, даже из разных исполняемых файлов Java?

Ответы [ 3 ]

1 голос
/ 15 мая 2009

Если вы запускаете два отдельных процесса, то у вас есть два отдельных типа и два отдельных экземпляра, независимо от того, является ли он одноэлементным.

Если вы хотите, чтобы два разных процесса общались друг с другом, вам нужно решить эту проблему совершенно отдельно. Доступно множество различных механизмов IPC - сеть, именованные каналы (хитрый из Java IIRC), файлы с отображением в памяти, простой общий каталог, в котором один процесс помещает задачи для обработки другому, и т. Д.

Также неясно, что именно висит, или как настроен ваш пул потоков. Если проблема действительно связана с многопоточностью (а не со стороны IPC), пожалуйста, опубликуйте короткую, но complete программу, которая демонстрирует проблему.

0 голосов
/ 15 мая 2009

Мне кажется, что вы используете два разных «основных» класса, каждый из которых использует один и тот же статический синглтон-класс. В этом случае будет создано два экземпляра синглтона - по одному в каждой JVM.

Я думаю, что вы хотите сделать, чтобы пул потоков был инкапсулирован в другом процессе, который работает как служба и предоставляет некоторый механизм для IPC, как прокомментировал Skeet. Обычный способ сделать это - открыть очередь JMS для получения запросов от разных производителей и заставить потребителя (вашего демона) отправлять полученные запросы в пул потоков для обработки.

Для запуска этой службы в качестве демона вы можете разместить ее в контейнере или использовать что-то вроде Java Service Wrapper , если вы работаете в Windows.

0 голосов
/ 15 мая 2009

Если размер пула потоков больше 1, тогда нет гарантии, что все объекты T1 будут обработаны первыми.

...