通常,当一个任务被提交给一个线程池(比如一个Fork-Join池)时,它会占用它运行的线程,直到它完成。因此,如果任务必须等待,例如Future
完成,它将保留线程。如果许多此类任务正在等待,这可能是不可取的;然后,许多线程被搁置。这不仅耗费大量内存,而且最坏的情况是,你可能达到极限并且无法再创建任何新线程导致死锁(例如,在我的macbook上,我无法在JVM中创建超过几千个线程)。
有人可能会争辩说,问题可以通过改变我的程序来解决,以避免这种情况,但很可能是因为我的程序可读性较低且冗长。
我的问题是,是否有可能以某种方式实现释放线程的方法release
,以便线程可用于从队列中获取另一个任务,并且将方法的其余部分安排为新任务?
所以我希望这可能是使用反射,但无法找到方法。
假设
就我而言,您只能假设Runnable
s(因此没有返回值)。也没有担心的调用堆栈,即,释放直接发生在构成提交给线程池的任务的方法中。
简单的用法是这样的:
// some code
while (! future.isDone()){
return;
}
// continue with the logic
答案 0 :(得分:0)
Java线程将一对一映射到本机线程,您要求的是不可能的。实际上你要求延续或绿色线程/协同程序。这些方法存在一些局限性,目前它们并不是很受欢迎。 JVM上存在的一个例子是Kotlin coroutines。
在纯Java中,您可以使该部分代码异步,并使用CompletableFuture.thenAccept
或其他可组合方法在原始未来完成后安排进一步处理。类似于Scala拥有更丰富的未来和承诺库。另一种可能性是拆分逻辑并将部分代码作为任务提交给Executor
实例。