java中的循环任务
我有一个可运行的对象,它在每次运行时都会更新(类变量)。我希望能够在单个线程中执行它(假定为SingleThreadExecutor?),但只有在上一次运行完成后才能执行 我尝试过执行器。newSingleThreadScheduledExecutor(),但它只提供基于时间的定期任务 我还遇到了另一个问题,如果我一遍又一遍地(在一个循环中)调度同一个runnable,它只运行一次 我怎样才能实现我想要的 班级:java中的循环任务,java,multithreading,executorservice,scheduledexecutorservice,Java,Multithreading,Executorservice,Scheduledexecutorservice,我有一个可运行的对象,它在每次运行时都会更新(类变量)。我希望能够在单个线程中执行它(假定为SingleThreadExecutor?),但只有在上一次运行完成后才能执行 我尝试过执行器。newSingleThreadScheduledExecutor(),但它只提供基于时间的定期任务 我还遇到了另一个问题,如果我一遍又一遍地(在一个循环中)调度同一个runnable,它只运行一次 我怎样才能实现我想要的 班级: public class Population implements Runnab
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(){…})
创建一个线程,不是吗?是的,你可以。我假设您可能需要执行器服务来做其他事情,比如获取未来
并取消它,而不是中断线程
。我将继续并接受这个答案。我可能需要一种不同的方法。无论如何,谢谢你:)