Обычный способ остановить поток - установить некоторый изменяемый логический флаг, я вижу, что в вашем случае это поле terminate
. Чтобы следовать нормальному шаблону, вы должны просто проверять этот флаг на каждой итерации, например while (!terminated && ...)
. Поток, который устанавливает флаг завершения, должен также поместить ваше конечное событие в какое-то поле, скажем, terminateEvent, которое вы должны проверить после цикла, если в этой точке значение true для завершения (то есть, если поток был завершен в отличие от обычного завершения). Конечно, доступ к terminateEvent должен быть синхронизирован (обратите внимание, что volatile, вероятно, здесь не будет работать).
Однако, поскольку у вас есть список событий для обработки, я бы предпочел следовать другому шаблону. Замените список параллельной очередью (хорошим примером является LinkedBlockingQueue), а затем, когда вам нужно завершить поток, вместо установки логического флага вы просто очищаете очередь и помещаете туда свое событие завершения. Поток обработки событий после обработки каждого события должен проверить, было ли это событием завершения (с помощью instanceof или какого-либо метода getEventClass ()), и если это так, просто разорвать цикл.
Обратите внимание, что поскольку в вашем потоке выполняются длительные операции, такие как Thread.sleep () и, возможно, waitWhileSuspended () (что бы это ни было, хотя оно может вам больше не понадобиться после переключения в очередь блокировки), вам нужно прерывать поток после помещения события завершения в очередь и обработки InterruptedException в потоке обработки событий в соответствии с логикой приложения. Например, вы должны решить, обрабатывать ли событие, если Thread.sleep () был прерван, или вместо этого переходить к следующей итерации.