Java 如何执行一个固定次数的可调用函数,并在每次执行之间有一个睡眠间隔/延迟

Java 如何执行一个固定次数的可调用函数,并在每次执行之间有一个睡眠间隔/延迟,java,multithreading,concurrency,executorservice,Java,Multithreading,Concurrency,Executorservice,我有一种情况,我需要检查某个条件是否满足,并且需要定期执行一定次数以检查该条件,然后再声明该条件不满足,并且在每次执行之间需要有一个延迟/睡眠间隔 代码结构: class checkCondition<T> implements Callable<T>{ @Override public T call() { //Do Stuff and return result return result; } public class TaskRunner<T> {

我有一种情况,我需要检查某个条件是否满足,并且需要定期执行一定次数以检查该条件,然后再声明该条件不满足,并且在每次执行之间需要有一个延迟/睡眠间隔

代码结构:

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并发。

尝试使用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();
    }
}

尝试使用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();
    }
}

谢谢你的回答。很重要的一点是,我要返回未来,我能用callable实现这一点吗?我觉得你可以拥有一个共享的ConcurrentHashMap,让所有线程在其结果中转储它们的ID或你分配给对象的任何唯一ID。释放latch.wait后,您可以获取结果。不,你不能这么做,谢谢你的回答。很重要的一点是,我要返回未来,我能用callable实现这一点吗?我觉得你可以拥有一个共享的ConcurrentHashMap,让所有线程在其结果中转储它们的ID或你分配给对象的任何唯一ID。释放latch.wait后,您可以获取结果。不,你不能对Callable这样做