我每隔5秒创建一个新线程并使用Threadpool exector.
我确保线程正在关闭。但我得到了
Exception in thread "Timer-0" java.lang.OutOfMemoryError: unable to create new native thread.
它是否正在发生,因为我正在创建许多线程而不关闭它们?或经常创建新的?
有人可以告诉我,如果我在代码中做错了吗?
public class API{
private MongoStoreExecutor executor = new MongoStoreExecutor(10,50);
private class MongoStoreExecutor extends ThreadPoolExecutor {
public MongoStoreExecutor(int queueSize, int maxThreadPoolSize) {
super(10, maxThreadPoolSize, 30, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(queueSize),
new ThreadPoolExecutor.CallerRunsPolicy());
}
}
public TimerTask alertingPoolsData() throws Exception, UnknownHostException {
TimeerTask task = new TimerTask(){
public void run(){
Pools = alertingPools.values().toArray();
List<Future<?>> tasks = new ArrayList<Future<?>>(Pools.length);
for (Object pool : Pools) {
tasks.add(executor.submit(new DataAccumulation(timeStartSecData,
timeEndSec,pool, jsonArrayResult,dataResult)));
}
for( Future<?> f: tasks) {
f.get(2 * 1000L, TimeUnit.MILLISECONDS);
}
}
} catch (Exception e) {
e.printStackTrace();
}
long interval = 5 * 1000L;
tm.scheduleAtFixedRate(task,(interval -
(System.currentTimeMillis() % interval)), interval);
return task;
}
}
答案 0 :(得分:0)
我的预感与我们看不到的代码有关:我怀疑你在某处一遍又一遍地调用alertingPoolsData
。因此,我怀疑您正在安排TimerTask
一遍又一遍。然后,这些组件TimerTasks
中的每一个都会重复创建一些未知数量的Future<?>s
(每个Pools
元素一个),每个元素都会转到MongoStoreExecutor
如果满足以上所有条件,您的线程计数曲线就会得到一个正的一阶导数。因此,随着时间的推移,您将看到线程计数的二次增加。你会很快开始点击upper limits of your native threads。
根据评论中的建议,您可以轻松修改当前的实施。我建议使用ScheduledExecutorService和ForkJoinPool的组合。