我试图绘制一个图表,说明多线程在系统中的工作方式以及由于阻塞方法而如何优化系统的延迟。
我使用Java8。在我的代码中,我调用CompleteableFuture.supplyAsync(...)。get()和CompleteableFuture.runAsync(...)。get()来启动一个新线程,但我没有非常熟悉:
这些线程正在哪个线程中运行?每次我调用supplyAsync或runAsync时,它是一个完全不同的线程池吗?还是同一线程池只是不同的线程?主线程在那个线程池中吗?还是主线程本身就在单独的线程池中运行? 是在主线程中获取阻塞,也就是我必须等待CompleteableFuture完成才能获得结果吗? 让我们说在runAsync中,我有两种方法。一个是checkIfCapable,第二个是doIt。 checkIfCapable不应阻塞,而doIt应该阻塞,因为我等待doIt的结果以确定是否应该在新线程中调用单独的CompleteableFuture。因此,从本质上讲,我在考虑回调,我启动了一个仅执行checkifCapable的新线程,然后将回调发送至主线程,直到那时,主线程才继续执行直到需要确定doIt。
答案 0 :(得分:0)
我将假定您没有使用自己的CompletableFuture
调用任何Executor
方法(在这种情况下,它将按照所说的Executor
的规则运行)。
Java 8引入了common fork-join pool,并且该池中的线程数通常等于您计算机上的内核数。在没有执行程序的情况下调用异步方法时,此fork-join池将用作执行程序。