【问题标题】:Confused between Multithreading and Asynchronous Programming [duplicate]多线程和异步编程之间的混淆[重复]
【发布时间】:2020-11-02 23:44:25
【问题描述】:

据我所知,多线程是我们可以提供给单个程序以并行运行多个任务或代码块的能力。例如,当我们输入 word doc 时,拼写检查器在单独的线程上运行。它类似于在单个程序级别上完成的多任务。

异步编程帮助我们实现的是提供编写代码的能力,它不会阻塞当前正在运行进程的线程并以顺序方式执行其余代码。例如,如果我们调用 db 来获取一些数据,然后对接收到的数据执行一些操作。之后,其他一些独立的东西正在执行。因此,为了不阻塞代码流,我们可以使用对数据执行逻辑操作的回调对 db 进行异步调用。其余的代码都是按顺序执行的。

我的问题是,如果我们知道程序中的依赖和独立任务是什么,我们不能简单地使用多线程的概念吗?为什么要引入这个异步编程的新概念?像 promises 一样,在 JavaScript 中回调或在 java 中完成未来。 Java 8 中还引入了可完成的未来。那么在 Java 8 之前存在什么?

如果我的陈述有任何错误,请纠正我。

【问题讨论】:

  • 这不是一个新概念
  • 异步仍然会阻塞,它使用一种叫做协作多任务的东西,所以如果在回调中你创建了一个无限循环,一切都会挂起。对于在 CPU/OS 级别工作的线程,一个线程不会阻塞另一个线程,除非使用关键部分/锁。线程也有更多的复杂性,即使增加一个数字也不是微不足道的。

标签: javascript java multithreading asynchronous


【解决方案1】:

好吧,据我所知,理论上你可以限制自己只使用异步函数和线程。

您的问题实际上是关于整个编程语言的范式。我的回答是,即使现代应用程序经常使用多线程,大多数代码仍然是按顺序执行的。输入 -> 计算 -> 输出。多年来,这一点并没有改变。

现在,从更实际的角度来看。在 Javascript 中,如果您只使用异步函数,您很快就会发现自己陷入了回调地狱 :) 如果您在 Java 中同时执行所有内容,结果几乎相同。

我的最后一个问题是:你会在哪里划清界限?您想异步执行所有内容,好的,但请记住,这些异步代码块本身仍然是同步的。那么,您是在问并行执行每一行代码吗?如果是这样,我认为这不是 Java/JS 的问题,而是招募一群新的编程语言开发人员的悬而未决的问题 :)

这是来自 java/js 开发人员的答案,也许存在一些可以满足您的问题的语言,但我不知道它们。

【讨论】:

  • 以异步方式编写代码,以免阻塞当前线程,即在移动到下一条指令之前不等待某条指令完成。让我们举一个例子,我做了一个数据库查询来获取一些数据并对这些数据进行一些操作。之后,有一个用于计算数字阶乘的代码。假设我们的代码在单个线程上运行,然后它正在等待 db 调用完成以计算阶乘。但是这里我们可以使用多线程同时执行这两个任务,但是执行db代码的线程本身就是阻塞的。
  • 这两种方法都为我们提供了编写非阻塞代码的相同优势,但如何使用取决于开发人员?谢谢你的回答
  • 是的,是否使用异步是开发人员的电话。
【解决方案2】:

答案是 java 1.0 与 java 1.8 具有相同的功能(除非在 java 1.0 发布时不存在像 INET6Address 这样的技术更改)。两者都图灵完备。

添加的是代码框架。添加 异步 只是在您想使用它时跳过必须一遍又一遍地实现或添加自定义框架。

【讨论】:

    猜你喜欢
    • 2017-09-14
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 2011-01-06
    相关资源
    最近更新 更多