Как бороться с блокировкой задач при использовании ScheduledThreadPoolExecutor - PullRequest
1 голос
/ 23 декабря 2010

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

Как этого достичь?

И в качестве дополнительного вопроса: в документации ScheduledThreadPoolExecuter говорится, что «Если какое-либо выполнение задачи встречает исключение, последующие выполнения подавляются».В моем случае я бы предпочел перезапустить задачу, которая не удалась.Есть ли способ изменить это поведение?

Ответы [ 2 ]

2 голосов
/ 23 декабря 2010

Для первого вопроса: используйте java.util.concurrent.Lock и вызовите tryLock () с таймаутом.Если время ожидания истекло (скажем, 5 секунд), создайте новое задание того же типа, что и текущее, передайте его исполнителю и вернитесь в ожидании блокировки, на этот раз блокирующим способом.

По второму вопросу я хотел бы рассмотреть возможность включения запланированного задания в большой блок try / catch для предотвращения появления непредвиденных исключений для самого исполнителя.

1 голос
/ 23 декабря 2010

Задумывались ли вы об использовании стороннего программного обеспечения с открытым исходным кодом?Кварцевый планировщик (http://www.quartz -scheduler.org /) очень гибкий и его стоит попробовать.

...