异步执行和同步执行之间的区别是什么?


当前回答

同步与异步

同步和异步操作是关于下一个任务相对于当前任务的执行顺序。

让我们看一个例子,Task 2是当前任务,Task 3是下一个任务。Task是堆栈(方法帧)中的原子操作方法调用。

同步

意味着任务将逐个执行。当前任务完成后才会启动下一个任务。任务2完成后才启动任务3。

单线程+同步-顺序

通常执行。

伪代码:

main() {
    task1()
    task2()
    task3()
}

多线程+同步-并行

屏蔽。

阻塞意味着线程只是在等待(尽管它可以做一些有用的事情)。例如:Java ExecutorService[About] and Future[About])伪代码:

main() {
    task1()
    Future future = ExecutorService.submit(task2())
    future.get() //<- blocked operation
    task3()
}

异步

暗示任务立即返回控制,并承诺执行代码,稍后通知结果(例如。回调功能)。即使任务2没有完成,任务3也会执行。异步回调,完成处理程序

单线程+异步-并发

使用回调队列(消息队列)和事件循环(运行循环,循环器)。事件循环检查线程堆栈是否为空,如果为真,则将第一个项目从回调队列推入线程堆栈,并再次重复这些步骤。简单的例子是按钮点击,发布事件…

伪代码:

main() {
    task1()
    ThreadMain.handler.post(task2());
    task3()
}

多线程+异步-并发和并行

非阻塞。

例如,当你需要在不阻塞的情况下在另一个线程上进行一些计算。伪代码:

main() {
    task1()

    new Thread(task2()).start();
    //or
    Future future = ExecutorService.submit(task2())

    task3()
}

你可以使用阻塞方法get()或通过循环使用异步回调来使用Task 2的结果。

例如,在移动世界中,我们有UI/主线程,我们需要下载一些东西,我们有几个选择:

同步块-阻塞UI线程并等待下载完成。UI没有响应。 异步回调-创建一个新的线程,使用异步回调来更新UI(不可能从非UI线程访问UI)。回调地狱。 async coroutine[关于]-带有同步语法的异步任务。它允许将下载任务(挂起功能)与UI任务混合。

[iOS同步/异步],[Android同步/异步]

[并行vs并行]

其他回答

简而言之,同步指的是两个或多个进程的起点和终点,而不是它们的执行。在本例中,进程A的端点与进程B的起点同步:

SYNCHRONOUS
   |--------A--------|
                     |--------B--------|

另一方面,异步进程的起点和终点不同步:

ASYNCHRONOUS
   |--------A--------|
         |--------B--------|

在进程A与进程B重叠的地方,它们是并发或同步运行的(字典定义),因此造成了混淆。

更新:Charles Bretana改进了他的答案,所以这个答案现在只是一个简单的(可能过于简化了)助记符。

你混淆了同步与并联与串联。同步的意思是同时发生所有的事情。同步的意思是彼此相关,可以是串联的,也可以是固定间隔的。当程序在做所有的事情时,它是串联运行的。找本字典……这就是为什么我们有不甜的茶。你有茶或甜茶。

我认为一个很好的方法是把它看作是一个经典的跑步接力赛

同步:流程就像同一个团队的成员一样,它们直到收到接力棒(前一个流程/运行者执行的结束)才会执行,但它们彼此都是同步的。

异步:在同一接力赛跑道上的不同团队的成员,他们将运行和停止,彼此异步,但在同一场比赛中(整体程序执行)。

这有意义吗?

同步与异步

同步和异步操作是关于下一个任务相对于当前任务的执行顺序。

让我们看一个例子,Task 2是当前任务,Task 3是下一个任务。Task是堆栈(方法帧)中的原子操作方法调用。

同步

意味着任务将逐个执行。当前任务完成后才会启动下一个任务。任务2完成后才启动任务3。

单线程+同步-顺序

通常执行。

伪代码:

main() {
    task1()
    task2()
    task3()
}

多线程+同步-并行

屏蔽。

阻塞意味着线程只是在等待(尽管它可以做一些有用的事情)。例如:Java ExecutorService[About] and Future[About])伪代码:

main() {
    task1()
    Future future = ExecutorService.submit(task2())
    future.get() //<- blocked operation
    task3()
}

异步

暗示任务立即返回控制,并承诺执行代码,稍后通知结果(例如。回调功能)。即使任务2没有完成,任务3也会执行。异步回调,完成处理程序

单线程+异步-并发

使用回调队列(消息队列)和事件循环(运行循环,循环器)。事件循环检查线程堆栈是否为空,如果为真,则将第一个项目从回调队列推入线程堆栈,并再次重复这些步骤。简单的例子是按钮点击,发布事件…

伪代码:

main() {
    task1()
    ThreadMain.handler.post(task2());
    task3()
}

多线程+异步-并发和并行

非阻塞。

例如,当你需要在不阻塞的情况下在另一个线程上进行一些计算。伪代码:

main() {
    task1()

    new Thread(task2()).start();
    //or
    Future future = ExecutorService.submit(task2())

    task3()
}

你可以使用阻塞方法get()或通过循环使用异步回调来使用Task 2的结果。

例如,在移动世界中,我们有UI/主线程,我们需要下载一些东西,我们有几个选择:

同步块-阻塞UI线程并等待下载完成。UI没有响应。 异步回调-创建一个新的线程,使用异步回调来更新UI(不可能从非UI线程访问UI)。回调地狱。 async coroutine[关于]-带有同步语法的异步任务。它允许将下载任务(挂起功能)与UI任务混合。

[iOS同步/异步],[Android同步/异步]

[并行vs并行]

同步是指以队列方式逐一执行任务。假设只有一辆车需要在朋友之间共享才能到达目的地,一辆车将被共享。 在异步情况下,每个朋友都可以租到车并到达目的地。