У меня есть поток, который зацикливает очередь, читает задачи и делегирует их в CachedThreadPool. Эта очередь постоянно заполняется отправленными клиентом задачами.
Я хочу завершить поток чтения, если клиентские программы также завершаются. Сначала я подумал, что установка потока чтения в качестве демона решит проблему. Однако с этим есть две проблемы:
- Поток читателя должен прочитать все события, оставшиеся в очереди, до его выхода.
- Поток читателя имеет CachedThreadPool. Поскольку потоки в нем не являются демонами, программа не будет завершена. Если я установлю все потоки в пуле как демон, каким-то образом они не будут обрабатывать всю работу (возможно, потому что программа чтения прекратит работу перед обработкой всей очереди).
Я также пытался решить эту проблему с помощью ловушки завершения работы, однако ловушка никогда не вызывается в нужное время (возможно, потому что я запускаю клиент из инструментов сборки?
Есть какие-нибудь намеки на то, чтобы обойти это?