java for循环内部使用线程

发布时间 2023-11-01 11:09:28作者: 不起眼的程序员
/**
* 1、业务场景  
*	1、定时执行时,可能出现数据量大,执行不完,线程直接被终止掉,丢数据。
*/

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
*  1、首先创建线程池,针对线程池开启多个线程。
*  2、for循环开始线程调用。
*  3、线程执行完成终止掉线程。
*/
public class ForLoopMultiThreading {
    public static void main(String[] args) {
        // 创建一个ExecutorService,用于管理线程
        ExecutorService executorService = Executors.newFixedThreadPool(5);

        // 创建一个List,用于存储for循环的结果
        List<Integer> resultList = new ArrayList<>();

        // 定义for循环的起始和结束值
        int start = 0;
        int end = 100;

        // 创建一个for循环,用于计算0到100之间的所有整数
        for (int i = start; i <= end; i++) {
            // 将for循环的结果添加到List中
            resultList.add(i);

            // 提交一个任务到ExecutorService中,用于执行for循环的每个迭代
            executorService.submit(() -> {
                // 在这个线程中执行for循环
                for (int j = start; j <= end; j++) {
                    System.out.println("Thread: " + Thread.currentThread().getName() + ", i: " + i + ", j: " + j);
                }
            });
        }
        
          //慎用:存在数据量大执行不完,直接关闭线程池,数据丢失。   根据业务场景自定义
          //如果线程内部报错,直接终止线程。按照定时任务执行的,定时执行五分钟一次。
            try {
                if (!executorService.awaitTermination(300, TimeUnit.SECONDS)) {
                    // 如果任务在300秒内仍未完成,强制关闭线程池
                    executorService.shutdownNow();
                }
            } catch (InterruptedException e) {
                // 捕获异常,并强制关闭线程池
                executorService.shutdownNow();
                e.printStackTrace();
            }
        

        // 关闭ExecutorService
        executorService.shutdown();

        // 输出for循环的结果
        System.out.println("Result List: " + resultList);
    }
}