1

我每 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;
    }
}
4

1 回答 1

0

我的预感与我们看不到的代码有关:我怀疑你在alertingPoolsData某个地方一遍又一遍地打电话。结果,我怀疑您正在TimerTask一遍又一遍地安排。然后,这些组件中的每一个都TimerTasks重复创建一些未知数量的Future<?>s(每个元素一个Pools),每个元素都将进入您的MongoStoreExecutor.

如果以上所有情况都是如此,那么您的线程数曲线上就有一个正的一阶导数。因此,随着时间的推移,您将看到线程数呈二次增长。您将很快开始达到本机线程的上限

正如评论中所建议的,您可以轻松地修改当前的实现。我建议将ScheduledExecutorServiceForkJoinPool结合起来。

于 2013-09-20T19:50:12.453 回答