使用 ScheduledExecutorService 实现 for 循环每 10 次暂停 1500 毫秒

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ForLoopWithPause {

    public static void main(String[] args) {
        // 假设 instLists 是一个 List<InstList> 对象
        List<InstList> instLists = instListMapper.selectInstListList(list);

        // 创建 ScheduledExecutorService
        ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();

        // 定义 Runnable 任务
        Runnable task = new Runnable() {
            int i = 0;

            @Override
            public void run() {
                if (i < instLists.size()) {
                    // Your code here
                    System.out.println("Processing: " + i);

                    // 每 10 次循环后暂停 1500 毫秒
                    if ((i + 1) % 10 == 0) {
                        try {
                            Thread.sleep(1500);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    i++;
                } else {
                    executor.shutdown();
                }
            }
        };

        // 每 1 秒执行一次任务
        executor.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS);
    }
}

解释:

  1. 创建 ScheduledExecutorService: 使用 Executors.newSingleThreadScheduledExecutor() 创建一个单线程的 ScheduledExecutorService。
  2. 定义 Runnable 任务: 创建一个 Runnable 任务,在 run() 方法中执行循环逻辑。
  3. 循环逻辑:run() 方法中,使用 i 变量跟踪循环次数。
    • 每 10 次循环,调用 Thread.sleep(1500) 暂停 1500 毫秒。
  4. 调度任务: 使用 executor.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS) 每 1 秒执行一次任务。

注意:

  • 这种方法使用 ScheduledExecutorService 实现定时执行,而不是直接在 for 循环中使用 Thread.sleep(),避免阻塞主线程。
  • 由于使用了多线程,请确保您的代码线程安全。

其他选择:

除了 ScheduledExecutorService,您还可以考虑使用以下方法实现类似功能:

  • 使用 Thread.sleep() 在循环中暂停,但会导致主线程阻塞。
  • 使用 TimerTimerTask,但它们在处理大量任务时效率可能较低。
  • 使用 java.util.concurrent.DelayQueue 存储延迟任务,然后循环处理。

选择哪种方法取决于您的具体需求和代码复杂度。

Java 使用 ScheduledExecutorService 实现 for 循环每 10 次暂停 1500 毫秒

原文地址: https://www.cveoy.top/t/topic/bdQo 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录