我正在底层学习 Java 并发,并且阅读了一些有关多线程和并发的 Java 文章和视频,但似乎无法将它们全部放在一起
这是我到目前为止所理解的要点(如果我错了,请纠正我!):
考虑到这一切
现在我想这就是令人困惑的地方 假设我有8个逻辑核心,和一个可以接收api调用的spring web mvc服务器。在这个 api 调用中,我们将执行一个永无止境的阻塞 I/O 操作 这是不是意味着
下一个将是对spring web mvc的改进,我希望以非阻塞的方式进行I/O操作,而不是在主线程上进行I/O操作。这意味着我将为每个 api 调用生成一个新线程。这是不是意味着
更进一步,我现在将使用 CompletableFuture / Future,以便它是异步且非阻塞的,而不是以阻塞方式在新线程上进行 I/O 调用。
x = CompletableFuture.supplyAsync(() -> {
// Long I/O call
})
// do some operation
x.join();
我的问题是
如果问题3的答案是线程将被阻塞,这是否意味着与
new thread I/O blocking call
(参考第二个改进)的唯一区别是,当我们使用completableFuture时,我们可以在阻塞之前// do some operation
打电话?
对于问题 3,我假设一旦我们到达代码的阻塞部分(.get() for Future / .join() completableFuture),线程将被释放并可以处理另一个请求。
注意:抱歉我的英语不好!
线程并不意味着它们会在每个核心上运行。