困惑于多线程和异步编程之间的区别。

16 浏览
0 Comments

困惑于多线程和异步编程之间的区别。

据我所理解,多线程是一种能够使单个程序同时运行多个任务或代码块的能力。例如,当我们在 Word 文档中输入时,拼写检查正在单独的线程上运行。它类似于多任务处理,但是在单个程序级别上进行。\n而异步编程帮助我们实现的是以一种不阻塞当前运行进程的线程的方式编写代码,并按顺序执行其余代码的能力。例如,如果我们进行一个数据库调用来获取一些数据,然后对接收到的数据进行一些操作。之后执行一些独立的其他操作。为了不阻塞代码流程,我们可以使用异步调用来进行数据库调用,并在回调函数中对数据进行逻辑操作。而其余的代码则按顺序执行。\n我的问题是,如果我们知道程序中哪些任务是依赖的,哪些是独立的,我们不能仅仅使用多线程的概念吗?为什么要引入这种新的异步编程概念?比如 JavaScript 中的 Promise、回调函数,或者 Java 中的 CompletableFuture。而且 CompletableFuture 是在 Java 8 中引入的,那在 Java 8 之前是什么情况?\n如果我在陈述中有任何错误,请纠正我。

0
0 Comments

随着现代应用程序对多线程的频繁使用,人们对多线程和异步编程之间的区别产生了困惑。从理论上讲,你可以限制自己只使用异步函数和线程,但事实上,大部分代码仍然是按顺序执行的。输入 -> 计算 -> 输出。这种顺序执行的模式多年来没有改变。

从实际的角度来看,在JavaScript中,如果你只使用异步函数,你很快就会陷入回调地狱 🙂 如果在Java中同时执行所有代码,也会得到类似的结果。

最后一个问题是:你想在哪里划线?你想要所有代码都异步执行,好,但请记住,这些异步代码块本身仍然是同步的。那么,你是在问是否要并行执行每一行代码?如果是这样的话,我认为这不是一个关于Java/JS的问题,而是一个关于招募一群新的编程语言开发人员的未解之谜 🙂

这是一个来自Java/JS开发者的答案,也许有些语言可以满足你的问题,但我不知道。

从一个以Java/JS为中心的视角来看,编写异步代码的目的是为了不阻塞当前线程,即在移动到下一条指令之前不等待某个指令完成。让我们举个例子,假设我进行了一个数据库查询以获取一些数据,并对该数据进行一些操作。之后,还有一段代码用于计算一个数的阶乘。假设我们的代码在单个线程上运行,那么在计算阶乘之前它会等待数据库调用完成。但是在这种情况下,我们可以使用多线程同时执行这两个任务,但执行数据库代码的线程本身会阻塞。

多线程和异步编程都提供了写非阻塞代码的相同优势,但使用哪种方式取决于开发者。谢谢你的回答。

是的,是否使用异步编程取决于开发者的决策。

0