当前位置: 首页 > 知识库问答 >
问题:

在提交给执行者服务的任务之间有延迟

邓昀
2023-03-14

我正在使用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);
    }

共有1个答案

童宏富
2023-03-14

既然希望它们在另一个线程上按顺序执行,为什么不使用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,这意味着编译器首先完成了第一个任务,然后才执行第二个任务。事实上,我在期待,因为第二个任务是一个短任务,它会在第一个任务之前完成。有什么解释吗?