2015-11-30 1 views
1

У меня возникла ситуация, когда мне нужно проверить, выполнено ли какое-либо условие, и его необходимо периодически выполнять определенное количество раз чтобы проверить условие до того, как оно объявит условие, которое не выполнено, и между каждым исполнением должен быть интервал задержки/сна.Как выполнить вызываемое фиксированное число раз и иметь интервал ожидания/задержку между каждым исполнением

Код Структура:

class checkCondition<T> implements Callable<T>{ 
@Override 
public T call() { 
//Do Stuff and return result 
return result; 
} 
public class TaskRunner<T> { 
private final ExecutorService executor = Executors.newSingleThreadExecutor(); 
public Future<T> runTask(checkCondiiton task, int times, long sleep){ 

while(times > 0){ 
future = executor.submit(task); 
Thread.sleep(sleep); 
times--; 
} 
return future; 
} 
} 

} 

ли выше реализация правильно? Если нет, пожалуйста, сообщите, что было бы лучше. Я новичок в ExecutorService и Java Concurrency.

ответ

2

Попробуйте использовать Executors.newSingleThreadScheduledExecutor()

Пример:

public class FixedScheduledExcutor 
{ 
    public static void main(String[] args) throws InterruptedException 
    { 
     ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); 
     CountDownLatch latch = new CountDownLatch(5); 
     executorService.scheduleAtFixedRate(new MyRunner(latch), 5, 5, TimeUnit.SECONDS); 
     latch.await(); 
     System.out.println("Shutting down service..."); 
     executorService.shutdown(); 
    } 
} 

class MyRunner implements Runnable 
{ 
    CountDownLatch latch; 

    MyRunner(CountDownLatch latch) 
    { 
     this.latch = latch; 
    } 

    @Override 
    public void run() 
    { 
     System.out.println("Do something : " + latch.getCount()); 
     latch.countDown(); 
    } 
} 
+0

Спасибо за ваш ответ. Важно, чтобы я вернул будущее, могу ли я сделать это с помощью вызываемого? – dracoorlock

+0

Я чувствую, что вы можете иметь общую ConcurrentHashMap и позволить всем потокам сбрасывать свои результаты с помощью своего идентификатора (или любого уникального идентификатора, который вы назначаете объектам. После освобождения latch.wait() вы можете получить результаты. Нет , вы не можете сделать это с помощью Callable – Maas