这是我的情况:我正在处理一些单线程代码。代码是随机的,我需要运行它的许多实例来了解平均值。为了让生活更轻松、更快捷,我目前的解决方案是使用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 个实例。
那么处理这样的事情的正确方法是什么?我真正需要的是一个线程池,可以在每次迭代后杀死线程。有没有办法杀死给定对象的run
方法中的线程?我应该考虑一些替代方案吗?Runnable
ExecutorService.submit
newFixedThreadPool