2012-07-25 60 views
0

我是ExecutorService的新手。现在我的方案是“数百万的数据365 * 24 * 7即将到来” 我有一些进程需要使用线程进行数据传入。如何在使用ExecutorService时避免“无法创建本机线程”?

ExecutorService es = Executors.newSingleThread(); 
es.execute(new ComputeDTask(data)); 

我发送数据到ComputeDTask进行一些执行。

每次数据进入时,创建new ComputeDTask的效率如何?也就是说,如果数据被接收一百万次,那么将会创建一百万个ComputeDTask对象。

+0

我们可以看到'ComputeDTask'的构造函数吗? – 2012-07-25 10:00:11

+0

您的问题标题似乎完成与内容无关。你是否在问构造大量物体的成本?或者你是否遇到“无法创建本地线程”的错误? – 2012-07-25 10:01:36

+0

运行代码程序时抛出“不能创建本地线程”后执行一些特定的时间段。 – sreekanthnu 2012-07-25 10:05:00

回答

1

显然你正在为每个任务创建一个全新的ExecutorService,并且永远不会关闭它们。这当然会导致您正在观察的线程泄漏。使用ExecutorService的正确方法是创建单个实例,它为您管理线程池。执行者在管理线程方面非常灵活和强大。

+0

我怎么能得到ExecutorService的单个实例与多线程 – sreekanthnu 2012-07-26 06:09:46

+0

[newCachedThreadPool](http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Executors.html#newCachedThreadPool() ) – 2012-07-26 07:44:59

2

创建线程的开销约为100微秒。即如果你的工作时间少于100微秒,你的开销将比完成工作更多,而你的程序可能会比单线程慢。

为现有的Executor服务创建任务的开销约为2微秒。即如果任务花费少于2微秒,则可能比实际工作花费更多。

如果你有CPU绑定的进程,你需要大约相同数量的线程作为核心,以保持所有内核的繁忙,同时尽量减少开销。

例如如果你有8个内核,我建议你结合所做的工作,让你有8个线程和一个任务,每个总计。你可以有比这更多的任务,但你可能会发现处理需要更长的时间。

当然,你应该关闭你的ExecutorService,当你完成它。您在所有示例中都看不到这一点的原因是,创建一个 ExecutorService可用于应用程序的生命周期。

0

在传入数据上,甚至使用new ComputeDTask(data)创建任务,然后将其传递给ThreadPool,在那里有100个线程,然后他们可以执行吞吐量更高的任务。

ExecutorService es = Executors.newFixedThreadPool(100); 

onGetData(){ 

    es.execute(new ComputeDTask(data)); 

} 
相关问题