У меня есть процесс, который я хочу запускать из разных источников.Как правильно управлять выполнением одного потока?
Предположим, у нас есть один случай, когда мы применяем какой-то другой процесс (назовем его «manualStarter») при определенных условиях хочет вызвать этот основной процесс. Для завершения основного процесса требуется некоторое время, скажем, от 10 секунд до 10 минут. Если процесс уже выполняется, а manualStarter пытается его запустить, он не должен ставиться в очередь более одного раза. Второй процесс, инициирующий запуск основного процесса, может быть «timedStarter», который будет запускать процесс раз в то время, но только если процесс не запущен, иначе он не будет запускать процесс в очередь, вместо этого попытается это снова через некоторое время.
Теперь я попытался реализовать этот менеджер процессов с помощью isAlive() и join(), но кажется, что isAlive() не является надежным вообще, пока он не изменит свое состояние на живое, 100 потоков этого поток может начаться (и иногда). Похоже, я не мог положиться на это.
Затем я попытался использовать службу SingleThreadExecutor, которая ближе к тому, что я ищу, она не блокирует что-либо, и она позволяет только одному потоку выполнять этот процесс, так что это хорошо, однако я до сих пор не знаю, как проверить статус/заблокировать его правильно или как еще я могу гарантировать, что очередь для запуска потока не станет больше 1. Я немного читаю, что семафоры часто используются для подобных задач, но я не уверен как я мог бы использовать их в этом сценарии.
Итак, как я мог достичь того, чего хочу? Нужно ли мне реализовать собственный ThreadPoolExecutor? Как мне это сделать? Есть ли лучший способ?
Вы можете использовать синхронизацию с помощью замков и некоторые флаг, чтобы достичь нужного свойства для резьбы. –
@WasiAhmad да, я верю, что у меня возникают проблемы, чтобы понять - где и как их использовать? –
Просто интересно: не было бы проще не запускать поток, но, возможно, добавить какой-то командный объект в какую-то ** очередь **? Другими словами: просто ваши внешние источники испускают команды в одну очередь; а компонент регулярно сканирует содержимое этой очереди и вызывает этот поток (при необходимости).Просто нажимайте новые команды, и очередь выполняет задание «ах, мы в настоящее время работаем, чтобы можно было отбросить» ?! – GhostCat