我正在使用sping-boot,我有这样一个用例,我想将列表的每个元素提交给执行器服务(线程池大小=4)。但是在每个必须处理的元素之间,我想要1秒钟的延迟。
Thread.sleep(1000)不工作,因为执行程序一睡觉就启动另一个线程。
list().forEach(key -> {
executorService.submit(new Runnable() {
@Override
public void run() {
process(key);
}
});
});
编辑:这是我的process()方法,我在最后尝试使用sleep,但没有成功。
private void process(long key) {
try {
//processing key
} catch (SystemException e) {
// Exception handling
}
Thread.sleep(1000);
}
既然希望它们在另一个线程上按顺序执行,为什么不使用ScheduledExecutorService
并轮询列表呢?
伪
java prettyprint-override">Iterator<Pojo> iterator = list().iterator();
Future<Pojo> future = executorService.schedule(() -> {
if (!iterator.hasNext()) {
future.cancel(false);
return;
}
Pojo pojo = iterator.next();
iterator.remove();
process(pojo.key());
}
要并行或异步运行一些东西,我可以使用ExecutorService:
我一直在寻找这样一种情况的解决方案:我有一个调用项的哈希集,并且我要将这个集提交给执行器进行并行执行。现在我想只要任何提交的任务完成,我应该能够分配一个新的Callable到Executor。 我尝试了这段代码,但是如果我使用Executor.Invoke,那么Executor将等待直到所有任务完成,如果我使用Executor.Submit,那么任务将按顺序完成。如有任何帮助,我们将不胜感激。
我正在ThreadPoolExecutor中运行多个任务。我将其初始化如下: 我自己实现了runnable(),其中包含一个方法来跟踪提交任务的进度。我提交的实例如下: 我正在寻找一种查询当前/挂起线程的执行器/阻塞队列的方法。我尝试使用jobQueue。toArray()和重写executor方法但在这两种情况下,返回的Runnable都是FutureTask类型,不包含太多数据。有没有一种方法
我有一个文件列表和一个分析这些文件的分析器列表。文件数量可以很大(200,000),分析器数量可以很大(1000)。所以操作总数可能非常大(200,000,000)。现在,我需要应用多线程来加快速度。我采用了这种方法: 但这种方法的问题是,它占用了太多的内存,我想有更好的方法可以做到这一点。我还是java和多线程的初学者。
向ExecutorService对象提交任务的执行顺序是什么? 场景:让我们暂时假设Executor线程池大小为5,我已经向它提交了20个可运行任务,我们知道一次只能执行5个任务,其余的任务将在bucket中等待。所以我的问题是提交的任务以什么顺序执行。它是遵循FIFO数据结构还是从bucket中随机选取任务。 还有,有没有办法指定它应该以什么顺序执行。 例子:
我在玩java多线程代码。我创建了一个具有固定线程池的executor服务。我正在提交两个任务顺序。我试图用线程使第一个任务变得很长。我在想这两个任务将并行运行。然而,当我运行程序时,程序会等待一段时间,然后输出一个B,这意味着编译器首先完成了第一个任务,然后才执行第二个任务。事实上,我在期待,因为第二个任务是一个短任务,它会在第一个任务之前完成。有什么解释吗?