在 Java 中,你可以通过 ThreadPoolExecutor 类来创建和管理线程池。如果将线程池定义为成员变量,则它只会在对象初始化时创建一次。如果在成员方法中执行了关闭线程池的语句,那么下次执行该成员方法时,线程池将不再可用。

为了确保每次执行成员方法时都使用一个新的线程池,可以将线程池的创建和关闭放在成员方法内部,而不是作为成员变量。

示例代码:

private void yourMethod() {
    int threadPoolSize = 10; // 线程池大小
    int maxThreadPoolSize = 20; // 最大线程池大小
    long keepAliveTime = 60; // 线程空闲时间(单位:秒)
    ThreadPoolExecutor executorService = new ThreadPoolExecutor(
            threadPoolSize, // 核心线程池大小
            maxThreadPoolSize, // 最大线程池大小
            keepAliveTime, // 线程空闲时间
            TimeUnit.SECONDS, // 时间单位
            new LinkedBlockingQueue<Runnable>() // 任务队列
    );

    List<CategoryTree> list = categoryService.treeList(parameter);

    if (!list.isEmpty()) {
        setChildList(list, parameter, executorService);
    }

    Map<String, Object> rsMap = Maps.newLinkedHashMap();
    rsMap.put('data', list);

    // 关闭线程池
    executorService.shutdown();

    return MessagePacket.newSuccess(rsMap, 'categoryTreeList success');
}

private void setChildList(List<CategoryTree> list, Map<String, Object> parameter, ThreadPoolExecutor executorService) {
    for (CategoryTree categoryTree : list) {
        executorService.execute(() -> {
            synchronized (this) {
                parameter.put('parentId', categoryTree.getCategoryId());
                List<CategoryTree> childList = categoryService.treeList(parameter);
                if (!childList.isEmpty()) {
                    categoryTree.setChildList(childList);
                    setChildList(childList, parameter, executorService);
                }
            }
        });
    }
}

在上面的代码中,每次执行 yourMethod() 方法时,都会创建一个新的线程池,并在执行完毕后关闭线程池,确保每次执行该方法时都使用一个新的线程池。

Java 线程池:在成员方法中创建和关闭线程池

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

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