2017-08-29 57 views
1

正常情况下,当一个任务被提交给一个线程池(我们假设一个Fork-Join池)时,它占用了它运行的线程直到它完成。因此,如果任务必须等待,例如完成Future,则它将保留该线程。如果许多此类任务正在等待,这可能是不可取的;然后,许多线程被搁置。这不仅会消耗大量内存,而且最糟糕的是,您可能会达到极限,并且无法再创建任何新线程导致死锁(例如,在我的macbook上,我无法在JVM中创建超过几千个线程)。Java/Scala ThreadPool:如何在等待时释放线程?

有人可能会争辩说,可以通过更改我的程序来避免这种情况,但很可能是因为我的程序不易读和更长的代价才能解决问题。


我的问题是是否有可能以某种方式来实现方法release释放线程使得线程可以被用于拾取从队列中的另一任务,并安排的休息方法作为一项新任务? 所以我希望这样做可能使用反射,但无法找出如何。

假设 在我的情况下,你只能假设Runnable s(因此没有返回值)。也不需要担心调用堆栈,即释放直接发生在构成提交给线程池的任务的方法中。

一个简单的用法是这样的:

// some code 
while (! future.isDone()){ 
    return; 
} 
// continue with the logic 

回答

0

Java线程映射一来一往原生线程,你问什么是不可能的。实际上,您正在寻求类似continuation或green threads/coroutines的内容。这种方法有一些局限性,目前它们不是很受欢迎。 JVM上存在的一个示例是Kotlin coroutines

在纯Java中,您可以使代码的这部分代码异步,并使用CompletableFuture.thenAccept或其他可组合方法在原始未来完成后安排进一步的处理。类似于斯卡拉拥有更丰富的期货和承诺库。另一种可能性是分割你的逻辑并将部分代码作为任务提交给Executor实例。

+0

事实上,它就像延续。让我检查一下Kotlin,看看如何解决我的问题。 – Mahdi