2010-04-21 74 views
0

我需要使用有限数量的线程(目前使用newFixedThreadPool)来创建程序,但是我遇到了所有线程都是从开始创建,以惊人的速度填充内存的问题。Java线程池功能

我想防止这种情况。线程只能在执行前不久创建。

例如:我调用程序并指示它在池中使用2个线程。该程序应该创建&立即(显然)立即启动前2个线程,创建下2个等待前2个,并在那一刻等到一个或两个前2个结束执行。

我想过扩展执行器或FixedThreadPool等等。然而,我不知道如何从那里开始,并怀疑它是最好的解决方案。最简单的会让我的主线程睡眠间隔,这也不是很好...

在此先感谢!

回答

2

看在您的文章中详细信息...

我所说的程序,并指示它在池中使用2个线程。程序应该创建&立即(显然)立即启动前2个线程,创建下2个等待前2,并在那一刻等到一个或两个前两个结束执行。

你的问题更多地是关于同步任务执行,而不是实际上合并线程。从你在这里说的话,你想要有2线程执行任意数量的任务;如果您不想同时运行100个作业,请不要创建100个线程池......

我会建议使用一个BlockingQueue来控制你的Runnables,或者使用一个ThreadPoolExecutor创建一个2线程池,并为它提供所有的任务。它将在线程可用时执行它们。

这与您在此尝试达成的目标有关吗?

+0

它更有意义。但是,由于你的回答,我已经着手于生产者/消费者方法,这正是我所需要的:1生产者阅读文件,x(待定义)消费者。谢谢:) – cpf 2010-04-21 14:47:28

+0

太棒了,很高兴它帮助;-) – Etienne 2010-04-21 16:43:45

3

你试过看看ThreadPoolExecutor?使用正确的构造函数参数,您可以轻松调整创建的线程的数量和保持活动时间。

+0

是的,对他来说,他需要设置核心线程号为0. – gimpf 2010-04-21 13:19:03

+0

我不明白这是如何改变实际情况的......在我的主线程中,我正在从一个文件读取,并根据到我正在阅读的一行内容中,我创建了一个线程并将其添加到执行程序。在这个构造函数中,我添加了读取行,所以对象具有它们。结果我实际上是在内存中填充文件,但较大的文件会导致巨大的性能和/或内存太少...... – cpf 2010-04-21 13:35:06

0

我不认为你应该操纵线程池的实现。如果您在执行前不久创建线程,那么您将失去池的主要优点,即重新使用线程。

也许你应该减少池中的最大线程数。如果指示池创建太多空间,则用于堆栈空间的总外部堆内存将占用所有可用内存。我认为这是你的OutOfMemoryError(?)。

+0

我还没有错误呢。但我预测它会。在某些情况下,程序应该处理更大和更大的数据集,我怀疑机器的内存将始终能够保持这一切。 – cpf 2010-04-21 13:29:28

0

如果您从性能的角度来看待这个问题,那么最好在初次启动应用程序时采用内存中的命中,而不是在程序运行时不断分配和释放内存的轰炸。

如果在启动应用程序时使用的内存太多,那么以后它仍然会占用过多内存。你应该调整线程池的大小。

使用线程池还有其他好处,例如,如果沿途丢失线程,线程池将自动创建一个新线程来替换线程池,使线程池保持恒定大小。

如果这不是您正在寻找的好处的类型,那么您可能希望手动处理内存中的线程,并避免线程池。

+0

我想我会自己处理一个镜头。虽然这听起来像很多工作跟踪线程数和所有。而且,它仍然需要睡眠时间来等待线程结束。有没有一种方法可以在没有ThreadPool的情况下“等待”几个线程? – cpf 2010-04-21 13:31:21