是否有必要存储cachedthreadpool?

时间:2014-02-27 12:49:14

标签: java executorservice

在我的应用程序中,我需要执行不同的未来任务。 我的电话会像

public Item getTaskResult(){
        //creating the task object named task
        Executors.newCachedThreadPool().execute(task);

        ....
}

只是调用Executors.newCachedThreadPool()是不对的? 我应该参考吗?我在浪费一些资源吗?

3 个答案:

答案 0 :(得分:2)

您的整个应用程序中可能只有一个CachedThreadPool。这样做,它允许您分解与池关联的资源,并利用更好的线程重用。

每次创建一个线程池是一项代价高昂的操作。因此,创建一次,并根据需要使用它。

答案 1 :(得分:1)

这样做:在你的房子里,你想每次游泳时都想建一个新的游泳池吗?只创建一个CachedThreadPool并使用它。

答案 2 :(得分:0)

您演示的代码最严重的问题是它有资源泄漏。线程池不会自动关闭,并且线程被杀死,因为它已无法访问。您可能会观察到您的线程数量不受限制地增长,直到最后得到OutOfMemoryException: cannot create a native thread.

可以合法地将任务提交到新的线程池并立即在其上调用shutdown。这将正常工作,即使未能成为最佳性能选项。

在处理此问题的不同级别上,线程池并非旨在以这种短暂的方式使用。您正在将池降级为原始Thread实例将执行的操作,其中使用线程池的主要目的是......好吧,池化线程,这是昂贵的系统资源。这就是全局单例是使用Executor服务的首选方法。