正常情况下,当一个任务被提交给一个线程池(我们假设一个Fork-Join池)时,它占用了它运行的线程直到它完成。因此,如果任务必须等待,例如完成Future
,则它将保留该线程。如果许多此类任务正在等待,这可能是不可取的;然后,许多线程被搁置。这不仅会消耗大量内存,而且最糟糕的是,您可能会达到极限,并且无法再创建任何新线程导致死锁(例如,在我的macbook上,我无法在JVM中创建超过几千个线程)。Java/Scala ThreadPool:如何在等待时释放线程?
有人可能会争辩说,可以通过更改我的程序来避免这种情况,但很可能是因为我的程序不易读和更长的代价才能解决问题。
我的问题是是否有可能以某种方式来实现方法release
是释放线程使得线程可以被用于拾取从队列中的另一任务,并安排的休息方法作为一项新任务? 所以我希望这样做可能使用反射,但无法找出如何。
假设 在我的情况下,你只能假设Runnable
s(因此没有返回值)。也不需要担心调用堆栈,即释放直接发生在构成提交给线程池的任务的方法中。
一个简单的用法是这样的:
// some code
while (! future.isDone()){
return;
}
// continue with the logic
事实上,它就像延续。让我检查一下Kotlin,看看如何解决我的问题。 – Mahdi