区别异步和多线程

2024-09-05 23:28
文章标签 多线程 区别 异步

本文主要是介绍区别异步和多线程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

异步执行:

1、通过单线程实现并发操作。任务在等待I/O(网络、文件)时,不会阻塞其他任务的执行

2、更节省系统资源,不需要常见多个线程

3、适合I/O密集型任务,如网络请求,数据库查询等

4、示例

using System;
using System.Threading.Tasks;class Program
{static async Task Task1Async(){Console.WriteLine("任务1开始");await Task.Delay(3000); // 模拟异步耗时操作Console.WriteLine("任务1完成");}static async Task Task2Async(){Console.WriteLine("任务2开始");await Task.Delay(3000); // 模拟异步耗时操作Console.WriteLine("任务2完成");}static async Task Main(string[] args){// 并发执行任务1和任务2Task task1 = Task1Async();Task task2 = Task2Async();await Task.WhenAll(task1, task2); // 等待所有异步任务完成Console.WriteLine("所有任务完成");}
}

输出

任务1开始
任务2开始
任务1完成
任务2完成
所有任务完成

解释

·两个任务几乎同时开始,并且各自等待完成。总耗时大约为 3 秒,因为它们是并发执行的

多线程:

1、通过创建多个线程并行执行任务,每个任务都可以独立运行并充分利用多个 CPU 核心。

2、在某些场景下(如大量计算),多线程执行可以真正地实现任务并行处理。

3、适合CPU 密集型任务,例如复杂的计算和数据处理等。

4、示例

using System;
using System.Threading;class Program
{static void Task1(){Console.WriteLine("任务1开始");Thread.Sleep(3000); // 模拟耗时操作Console.WriteLine("任务1完成");}static void Task2(){Console.WriteLine("任务2开始");Thread.Sleep(3000); // 模拟耗时操作Console.WriteLine("任务2完成");}static void Main(){Thread thread1 = new Thread(Task1);Thread thread2 = new Thread(Task2);// 启动线程thread1.Start();thread2.Start();// 等待线程结束thread1.Join();thread2.Join();Console.WriteLine("所有任务完成");}
}

输出

任务1开始
任务2开始
任务1完成
任务2完成
所有任务完成

解释:任务1和任务2在各自的线程上并行运行。总耗时大约为 3 秒。

练习:

区分Task.Delay(3000).Wait()await Task.Delay(3000) 和 Thread.Sleep(3000)

1、Thread.Sleep(3000)   同步阻塞,程序执行被阻塞,等待3秒后继续,程序“卡住”

2、Task.Delay(3000)         异步阻塞,程序执行继续,完全没影响

3、await Task.Delay(3000)  异步阻塞,程序执行被暂停,等待3秒后继续,但是程序不是“卡住”,当前线程可以去执行其他任务,而不是被“卡住”在某个等待操作上

        表现:暂停期间,线程空闲出来可以处理其他任务,等异步任务完成后,程序会继续执行挂起的部分(回调

4、Task.Delay(3000).Wait()   调用wait办法,将异步阻塞变为同步阻塞!

这篇关于区别异步和多线程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140361

相关文章

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

javascript中break与continue的区别

在javascript中,break是结束整个循环,break下面的语句不再执行了 for(let i=1;i<=5;i++){if(i===3){break}document.write(i) } 上面的代码中,当i=1时,执行打印输出语句,当i=2时,执行打印输出语句,当i=3时,遇到break了,整个循环就结束了。 执行结果是12 continue语句是停止当前循环,返回从头开始。

js异步提交form表单的解决方案

1.定义异步提交表单的方法 (通用方法) /*** 异步提交form表单* @param options {form:form表单元素,success:执行成功后处理函数}* <span style="color:#ff0000;"><strong>@注意 后台接收参数要解码否则中文会导致乱码 如:URLDecoder.decode(param,"UTF-8")</strong></span>

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository。如果采用原始直接打包放到lib目录的方式进行处理,便对项目的管理带来一些不必要的麻烦。例如版本升级后需要重新打包并,替换原有jar包等等一些额外的工作量和麻烦。为了避免这些不必要的麻烦,通常我们

ActiveMQ—Queue与Topic区别

Queue与Topic区别 转自:http://blog.csdn.net/qq_21033663/article/details/52458305 队列(Queue)和主题(Topic)是JMS支持的两种消息传递模型:         1、点对点(point-to-point,简称PTP)Queue消息传递模型:         通过该消息传递模型,一个应用程序(即消息生产者)可以

Java 多线程概述

多线程技术概述   1.线程与进程 进程:内存中运行的应用程序,每个进程都拥有一个独立的内存空间。线程:是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换、并发执行,一个进程最少有一个线程,线程实际数是在进程基础之上的进一步划分,一个进程启动之后,进程之中的若干执行路径又可以划分成若干个线程 2.线程的调度 分时调度:所有线程轮流使用CPU的使用权,平均分配时间抢占式调度

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):