这是我的情况:我正在编写一些单线程代码。该代码是随机的,我需要运行它的许多实例才能了解平均值。为了让生活更轻松、更快,我当前的解决方案是使用 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/