2015-03-11 3 views
0

Я хочу написать блок кода, где я хочу, чтобы мой поток спал, скажем, 10 минут. Я могу сделать это через Thread.sleep().Сон, но освобождение блокировки

Но я хочу освободить приобретенный замок. Так может использоваться и другой поток. В этой ситуации я могу использовать object.wait(). Но я не могу, так как другой поток, который получает блокировку, делает notify() после обработки. Так что мой поток снова проснулся, может быть до 10 минут.

Мне нужен точный сон 10 минут, а также я не хочу держать замок. Так что другие потоки могут использовать его.

Пожалуйста, помогите. Спасибо

+2

освободите замок/сна/закройте замок? – assylias

+0

reacquire lock только после сна ожидаемого времени (скажем, 10 мин). Если какой-либо другой поток вызывает уведомления, то также я не хочу, чтобы спальный поток просыпался до истечения 10 минут. –

+0

В принципе я не буду ждать и отпускать замок. Но просыпаться ony после истечения времени сна не имеет значения, если другие потоки называют уведомлять. –

ответ

2

Используйте ScheduledExecutorService.

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 

scheduler.schedule(runnableTask, 10, TimeUnit.MINUTES); 

где runnableTask является экземпляром класса, который реализует Runnable и имеет код, который вы хотите запустить в методе run().

Если вам нужно, чтобы ваш код возвращал значение, используйте Callable вместо Runnable.

Возможно, вы захотите использовать блок synchronized с блокировкой в ​​коде или любой другой конструкции параллелизма, чтобы избежать одновременного запуска нескольких кодов.

Смежные вопросы