写点什么

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

作者:IT小码哥
  • 2025-05-27
    北京
  • 本文字数:1817 字

    阅读完需:约 6 分钟

前言

并发编程是现代编程语言中不可或缺的特性,不管是 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 CTAG----主线程执行结束
复制代码


fut 的类型是 Future , 可以在获取 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 的话,下面的日志也会被打印,意味着线程并不会真正的终止,可能会继续执行到结束。

总结

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


用户头像

IT小码哥

关注

还未添加个人签名 2021-04-29 加入

还未添加个人简介

评论

发布
暂无评论
华为仓颉语言初识:并发编程之线程的基本使用_鸿蒙 Ability_IT小码哥_InfoQ写作社区