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

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 本文详细介绍了仓颉语言中线程的基本使用,包括线程创建(通过`spawn`关键字)、线程名称设置、线程执行控制(使用`get`方法阻塞主线程以获取子线程结果)以及线程取消(通过`cancel()`方法)。文章还指出仓颉线程与Java等语言的差异,例如默认不提供线程名称。掌握这些内容有助于开发者高效处理并发任务,提升程序性能。

前言

并发编程是现代编程语言中不可或缺的特性,不管是 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 的话,下面的日志也会被打印,意味着线程并不会真正的终止,可能会继续执行到结束。

总结

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

目录
打赏
0
2
2
2
20
分享
相关文章
【JAVA 并发秘籍】进程、线程、协程:揭秘并发编程的终极武器!
【8月更文挑战第25天】本文以问答形式深入探讨了并发编程中的核心概念——进程、线程与协程,并详细介绍了它们在Java中的应用。文章不仅解释了每个概念的基本原理及其差异,还提供了实用的示例代码,帮助读者理解如何在Java环境中实现这些并发机制。无论你是希望提高编程技能的专业开发者,还是准备技术面试的求职者,都能从本文获得有价值的见解。
149 1
Go语言是如何支持多线程的
【10月更文挑战第21】Go语言是如何支持多线程的
188 72
面试直击:并发编程三要素+线程安全全攻略!
并发编程三要素为原子性、可见性和有序性,确保多线程操作的一致性和安全性。Java 中通过 `synchronized`、`Lock`、`volatile`、原子类和线程安全集合等机制保障线程安全。掌握这些概念和工具,能有效解决并发问题,编写高效稳定的多线程程序。
189 11
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
734 6
Java 多线程并发编程
Java多线程并发编程是指在Java程序中使用多个线程同时执行,以提高程序的运行效率和响应速度。通过合理管理和调度线程,可以充分利用多核处理器资源,实现高效的任务处理。本内容将介绍Java多线程的基础概念、实现方式及常见问题解决方法。
313 1
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
Go语言多线程的优势
【10月更文挑战第15天】
81 4
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
111 3
探索Python的并发编程:线程与进程的比较与应用
本文旨在深入探讨Python中的并发编程,重点比较线程与进程的异同、适用场景及实现方法。通过分析GIL对线程并发的影响,以及进程间通信的成本,我们将揭示何时选择线程或进程更为合理。同时,文章将提供实用的代码示例,帮助读者更好地理解并运用这些概念,以提升多任务处理的效率和性能。
151 3
Java中的并发编程:理解并应用线程池
在Java的并发编程中,线程池是提高应用程序性能的关键工具。本文将深入探讨如何有效利用线程池来管理资源、提升效率和简化代码结构。我们将从基础概念出发,逐步介绍线程池的配置、使用场景以及最佳实践,帮助开发者更好地掌握并发编程的核心技巧。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问