当前位置: 首页 > news >正文

华为仓颉语言初识:并发编程之线程的基本使用

前言

并发编程是现代编程语言中不可或缺的特性,不管是 java,kotlin,python, 还是仓颉语言都离不开线程的使用,熟练掌握并使用线程是日常开发中处理耗时操作或处理并发有效提高应用程序的性能,本篇文章将详细介绍线程在仓颉语言中的基本使用,建议点赞收藏!

线程创建

在仓颉语言中使用 spawn 关键字创建一个仓颉线程,类似 kotlin 中的 thread,仓颉已经封装好了线程的创建细节,开发者直接使用关键字 spawn 即可创建线程。

spawn{ =>println("create a thread A")sleep(20 * Duration.millisecond) println("thread A finish")}

箭头后面的无参 lambda 表达式为线程执行的方法体,其中 sleep 表示线程进入睡眠,开发者也自定义时长,这一点和 java 中的 sleep 作用一致, Duration 支持 秒,分,小时,微秒等单位。

线程名称

仓颉线程的名称可以通过两种方式获取,第一种是通过调用当前线程的静态方法。第二种是通过线程对象获取。

 let fut =    spawn {AppLog.info("进入子线程")sleep(Duration.second)AppLog.info("Thread name:"+Thread.currentThread.name)}// fut.thread.name = "Thread C"

当没有调用线程对象给线程赋值名称时,代码中的 Thread name日志 处调用 Thread.currentThread.name 获取的线程名称为空字符串。当通过线程对象 fut.thread.name 给线程指定名称后,Thread name 日志才能正确打印线程名称,这点和 java 中不同,java 会给线程指定一个默认线程名称,而仓颉线程并没有。这点需要注意。

线程执行

在仓颉语言中,如果只是通过 spawn 关键字来启动线程,无法阻塞主线程,即可能出现当主线程执行完,子线程才刚执行完,如果需要在主线程执行结束之前,获取子线程的执行结果,就需要通过调用线程对象的 get 方法获取执行结果。

 let fut =    spawn {AppLog.info("TAG----进入子线程")sleep(Duration.second)AppLog.info("TAG----Thread name:"+Thread.currentThread.name)}fut.thread.name = "Thread C"AppLog.info("TAG----主线程执行结束")//执行结果
TAG----主线程执行结束
TAG----进入子线程
TAG----Thread name:Thread C

调用线程对象的 get 方法,让主线程等待子线程的执行结果。

let fut =    spawn {AppLog.info("TAG----进入子线程")sleep(Duration.second)AppLog.info("TAG----Thread name:"+Thread.currentThread.name)}fut.thread.name = "Thread C"fut.get()AppLog.info("TAG----主线程执行结束")//执行结果
TAG----进入子线程
TAG----Thread name:Thread C
TAG----主线程执行结束

fut 的类型是 Future<T> , 可以在获取 spawn 执行完后的结果。

线程取消

仓颉中取消线程,可以直接调用线程对象的 cancel()方法,但是该方法不会立即停止线程,需要使用 Thread.hasPendingCancellation 来检查线程是否被终止。这一点和 java 中的 Thread.isInterrupted 很像

let fut =    spawn {AppLog.info("TAG----进入子线程")sleep(Duration.second)if(Thread.currentThread.hasPendingCancellation){AppLog.info("TAG---- 当前线程已被取消")return}AppLog.info("TAG----Thread name:"+Thread.currentThread.name)}fut.thread.name = "Thread C"fut.cancel()AppLog.info("TAG----主线程执行结束")

需要注意的是当调用了 cancle () 方法后,尽管通过判断条件得知当前线程将要被取消,如果不使用 return 的话,下面的日志也会被打印,意味着线程并不会真正的终止,可能会继续执行到结束。

总结

仓颉中的线程和其他开发语言中的线程很类似, 对于有经验的开发者来说理解和上手都十分容易,值得注意的是仓颉线程和其他语言的不同之处。学会的小伙伴赶紧动手试试吧!

http://www.xdnf.cn/news/682669.html

相关文章:

  • PCB线路板压合工艺难点解析与技术对策
  • NB-IoT NPUSCH(三)-资源映射
  • gdiplus,GDI +为什么2001年发布后几乎没有再更新了
  • 2025 海外短剧 CPS 系统开发:技术驱动下的全球化内容分销新范式
  • SSM整合:Spring+SpringMVC+MyBatis完美融合实战指南
  • 第十二天 区块链在车辆数据存证中的应用
  • Erp系统介绍与业务方案详情
  • 彻底理解一个知识点的具体步骤
  • 【PP】SAP生产订单(创建-下达-发料-报工-入库)全流程及反向流程
  • VectorNet:自动驾驶中的向量魔法
  • 【Agent】MLGym: A New Framework and Benchmark for Advancing AI Research Agents
  • CVPR2022——立体匹配算法Fast-ACVNet复现
  • 藻华自用数据集学习2025.4.28
  • SPL 轻量级多源混算实践 2 - 查询 csv/xls 等文件
  • 将图层为shapefile类型的文件转成PostGis类型的详细实现步骤
  • 【Linux】cat命令 – 在终端设备上显示文件内容
  • 通用机环境下安全版单机数据库使用非root用户管理的解决方案
  • gbase8s统计更新(UPDATE STATISTICS)介绍
  • redis分布式锁在高并发场景下的方案设计与性能提升
  • 晓辉教育五维乾坤:五个成语解码教育范式革命
  • mysql explain使用
  • 图片压缩工具 | Electron+Vue3+Rsbuild开发桌面应用
  • SecureCRT 和 MobaXterm 用于串口收发时数据异常(无法成功发送)——更改换行符解决
  • OpenResty 入门指南:从基础到动态路由实战
  • 第1章 Redis 概述
  • Java基础 Day22
  • python变量如何理解?
  • 图像分割全路线学习(结合论文)
  • go build -gcflags 参数学习
  • Spring Boot事务失效场景及解决方案