java - 如何在 Java 中创建一个线程池,在每次运行时创建一个新线程?

标签 java multithreading threadpool

这是我的情况:我正在编写一些单线程代码。该代码是随机的,我需要运行它的许多实例才能了解平均值。为了让生活更轻松、更快,我当前的解决方案是使用 Executors.newFixedThreadPool。现在的问题是每个线程都需要有自己独立的数据。我最初实现的方式是这样的:

public class Data {
    private static Map<Thread, Data> instanceMap = new ConcurrentHashMap<Thread, Data>();

    public static Data getInstance() {
        if (!instanceMap.containsKey(Thread.currentThread()))
            instanceMap.put(Thread.currentThread(), new Data());
        return instanceMap.get(Thread.currentThread());
    }

    private Data() {
    }
}

当迭代次数 <= 线程数时,这很好。但是,当我使用 8 个线程运行 20 次迭代时,出现了问题。由于这 8 个线程将被重用来运行这 20 次迭代,因此 instanceMap 将仅包含 8 个实例。

那么处理这样的事情的正确方法是什么?我真正需要的是一个在每次迭代后杀死线程的线程池。有没有办法杀死提供给 ExecutorService.submit 的 Runnable 对象的 run 方法中的线程?我应该考虑使用 newFixedThreadPool 的替代方案吗?

最佳答案

主要问题是您在全局映射中存储由某个线程执行的任务的本地数据。只需将数据范围限定到任务,一切就会变得简单得多:

Callable<Foo> task = new Callable<Foo>() {
    private Data data = new Data();

    public Foo call() {
        // execute your task here, using the task's data
    }
});

executorService.submit(task);

关于java - 如何在 Java 中创建一个线程池,在每次运行时创建一个新线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18238265/

相关文章:

java - java中的四舍五入结果

java - 关闭项目后线程仍然退出,如何杀死它?

python - 如何在发生错误时重新执行 ThreadPoolExecutor 中的函数?

java - Java中的连接池和线程池设置

iphone - UI ActivityIndi​​cator 是否需要在 iPhone 上手动线程化

python - 内存分配失败: growing buffer - Python

java - 客户端服务器请求过滤

java - MongoDB查询集合中的多个字段

java - 用二维数组表示图形

python - 超时后杀死Python中的子进程