在我的应用程序中,我需要执行不同的未来任务。 我的电话会像
public Item getTaskResult(){
//creating the task object named task
Executors.newCachedThreadPool().execute(task);
....
}
只是调用Executors.newCachedThreadPool()是不对的? 我应该参考吗?我在浪费一些资源吗?
答案 0 :(得分:2)
您的整个应用程序中可能只有一个CachedThreadPool。这样做,它允许您分解与池关联的资源,并利用更好的线程重用。
每次创建一个线程池是一项代价高昂的操作。因此,创建一次,并根据需要使用它。
答案 1 :(得分:1)
这样做:在你的房子里,你想每次游泳时都想建一个新的游泳池吗?只创建一个CachedThreadPool并使用它。
答案 2 :(得分:0)
您演示的代码最严重的问题是它有资源泄漏。线程池不会自动关闭,并且线程被杀死,因为它已无法访问。您可能会观察到您的线程数量不受限制地增长,直到最后得到OutOfMemoryException: cannot create a native thread.
您可以合法地将任务提交到新的线程池并立即在其上调用shutdown
。这将正常工作,即使未能成为最佳性能选项。
在处理此问题的不同级别上,线程池并非旨在以这种短暂的方式使用。您正在将池降级为原始Thread
实例将执行的操作,其中使用线程池的主要目的是......好吧,池化线程,这是昂贵的系统资源。这就是全局单例是使用Executor服务的首选方法。