java中的循环任务

java中的循环任务,java,multithreading,executorservice,scheduledexecutorservice,Java,Multithreading,Executorservice,Scheduledexecutorservice,我有一个可运行的对象,它在每次运行时都会更新(类变量)。我希望能够在单个线程中执行它(假定为SingleThreadExecutor?),但只有在上一次运行完成后才能执行 我尝试过执行器。newSingleThreadScheduledExecutor(),但它只提供基于时间的定期任务 我还遇到了另一个问题,如果我一遍又一遍地(在一个循环中)调度同一个runnable,它只运行一次 我怎样才能实现我想要的 班级: public class Population implements Runnab

我有一个可运行的对象,它在每次运行时都会更新(类变量)。我希望能够在单个线程中执行它(假定为SingleThreadExecutor?),但只有在上一次运行完成后才能执行

我尝试过执行器。newSingleThreadScheduledExecutor(),但它只提供基于时间的定期任务

我还遇到了另一个问题,如果我一遍又一遍地(在一个循环中)调度同一个runnable,它只运行一次

我怎样才能实现我想要的

班级:

public class Population implements Runnable{
 private int count=0;
 ...

@Override
public void run(){
    evaluateAll();

    List<Individual> parents = elitism();

    individuals.clear();

    for (int i = 0; i < popSize; i++) {
        Individual child = Individual.uniformCrossover(parents);
        if(Utilities.RANDOM.nextDouble() < mrate)
            child.mutate();
        individuals.add(child);
    }

    System.out.println(this);
 }
}
公共类填充实现可运行{
私有整数计数=0;
...
@凌驾
公开募捐{
evaluateAll();
列出父母=精英主义();
个人。清除();
对于(int i=0;i
启动部分:

Population population = new Population();
    ScheduledExecutorService ses = Executors
            .newSingleThreadScheduledExecutor();
    for (int i = 0; i < 300; i++)
        ses.schedule(population, 0, TimeUnit.MILLISECONDS);
    ses.shutdown();
人口=新人口();
ScheduledExecutors服务=执行者
.newSingleThreadScheduledExecutor();
对于(int i=0;i<300;i++)
ses.时间表(人口,0,时间单位毫秒);
ses.shutdown();

您只需在专用线程的循环中运行代码即可

public static void main(String[] args) throws Exception {
    ExecutorService executorService = Executors.newSingleThreadExecutor();
    executorService.submit(() -> {
        for (;;)
            statefulRunnable.run();
    });
}

public static final Runnable statefulRunnable = new Runnable() {
    private int state;

    @Override
    public void run() {
        state++;
    }
};

第一件事:您的Population类可能不应该实现Runnable。您希望重复更新对象,这可能需要使用其他可运行程序和线程。一种方法(尽管可能不是很漂亮)是让您的人口工作者知道执行者。然后,工作线程可以使用池在完成任务时重新调度自己。但是,如果我正确理解了您的问题,那么您只有一个worker,这也可以在worker方法中使用迭代或递归方法来完成,而不是重新调度worker线程以重新运行整个方法?您说的是“每次运行都会更新的可运行对象”-但在您的代码中它永远不会更新。如果在方法run()中更新了run(),那么只需将run()替换为一个循环,并在其内部使用旧的run()即可。个人是一个
列表
,可以清除并重新填充。我知道这很旧,但我只是遇到了同样的要求,似乎它可以解决它。但是执行者不是有点过火了吗?我可以用
new-thread(new-Runnable(){…})
创建一个线程,不是吗?是的,你可以。我假设您可能需要执行器服务来做其他事情,比如获取
未来
并取消它,而不是中断
线程
。我将继续并接受这个答案。我可能需要一种不同的方法。无论如何,谢谢你:)