我(原作者)最近开始阅读G. Blake Meike的“Android Concurrency”,到目前为止,我可以强烈推荐这本伟大的书:它包含了很多洞察如何各种Android并发机制的工作,何时喜欢一种方法,以及如何获得最好的工具,在您的处置。我决定遵循代码示例,并在我的电脑上重新创建它们,并且由于我非常爱Kotlin,我认为这将是一个好主意,将示例转换为Kotlin在旅途中。当我开始重写Kotlin中的代码示例时,我非常惊讶地发现:
Kotlin中没有synchronized关键字
Kotlin中没有volatile关键字
Kotlin的Any类似于Java的Object,没有wait(),notify()和notifyAll()方法
那么并发如何在Kotlin中工作呢?这个问题已经在Kotlin论坛上提出,这里是来自Andrey Breslav,Kotlin项目负责人的回答:
Kotlin故意没有内置并发语言的构造。我们认为这应该由图书馆来处理。
虽然Kotlin没有这些东西内置的语言,它仍然提供了一堆低级并发工具。让我们来看看商店里有什么。

创建线程

有两种方法在Java中创建线程:扩展Thread类,或者实例化它并通过构造函数传递一个Runnable。 因为你可以很容易地在Kotlin中使用Java类,这两个解决方案都很好。 这里是你如何子类Thread:

object : Thread() {  override fun run() {println("running from Thread: ${Thread.currentThread()}")}
}.start()

此代码使用Kotlin的对象表达式创建一个匿名类并覆盖run()方法。 下面是如何将一个Runnable传递给一个新创建的Thread实例:

Thread({  println("running from lambda: ${Thread.currentThread()}")
}).start()

你在这里看不到Runnable:在Kotlin中,它可以很容易地替换为lambda表达式。 有更好的方法吗? 当然! 以下是如何实例化和启动线程Kotlin风格:

thread(start = true) {  println("running from thread(): ${Thread.currentThread()}")
}

整洁,不是吗? 我们正在使用thread()函数,它神奇地隐藏所有的样板代码。 事实上,thread()中没有魔法:


public fun thread(start: Boolean = true, isDaemon: Boolean = false, contextClassLoader: ClassLoader? = null, name: String? = null, priority: Int = -1, block: () -> Unit): Thread {  val thread = object : Thread() {public override fun run() {block()}}if (isDaemon)thread.isDaemon = trueif (priority > 0)thread.priority = priorityif (name != null)thread.name = nameif (contextClassLoader != null)thread.contextClassLoader = contextClassLoaderif (start)thread.start()return thread

这只是一个非常方便的包装函数,是一个快乐使用。

同步方法和块

synchronized不是Kotlin中的关键字,它替换为@Synchronizedannotation。 Kotlin中的同步方法的声明将如下所示:

ps:我是不太明白Kotlin开发团队的用意,把原来Java中的注解@Override变成了override关键字;又把synchronized关键字变成了注解@Synchronizedannotation;我只想说  what are you 弄啥嘞!?!

@Synchronized fun synchronizedMethod() {println("inside a synchronized method: ${Thread.currentThread()}")
}

注释与Java的synchronized具有相同的效果:它会将JVM方法标记为同步。 对于同步块,你必须使用synchronized()函数,它使用锁作为参数:

fun methodWithSynchronizedBlock() {  println("outside of a synchronized block: ${Thread.currentThread()}")synchronized(this) {println("inside a synchronized block: ${Thread.currentThread()}")}
}

代码看起来和行为非常类似于Java变体。

可变字段

同样的故事,Kotlin没有volatile关键字,但是有@Volatileannotation:

@Volatile private var running = falsefun start() {  running = truethread(start = true) {while (running) {println("Still running: ${Thread.currentThread()}")}}
}fun stop() {  running = falseprintln("Stopped: ${Thread.currentThread()}")
}

该行为类似于@Synchronized:@Volatile会将JVM备份字段标记为volatile。

wait(), notify() 和 notifyAll()

Kotlin中的每个类都继承自Any,但Any不声明wait(),notify()和notifyAll(),这意味着这些方法不能在Kotlin类上调用。 但是你仍然可以使用java.lang.Object的一个实例作为锁,并调用它的方法。 这里是使用Object作为锁的生产者/消费者问题的解决方案:

private val lock = java.lang.Object()fun produce() = synchronized(lock) {  while (items >= maxItems) {lock.wait()}Thread.sleep(rand.nextInt(100).toLong())items++println("Produced, count is $items: ${Thread.currentThread()}")lock.notifyAll()
}fun consume() = synchronized(lock) {  while (items <= 0) {lock.wait()}Thread.sleep(rand.nextInt(100).toLong())items--println("Consumed, count is $items: ${Thread.currentThread()}")lock.notifyAll()
}

它看起来很黑吗? 好吧,是的。 真理是,如果你在代码中依赖这样的低级结构 - 很可能你做错了。 现在有很多高级并发机制用于Java和Kotlin的每一个目的。 这里有一个伟大的Stackoverflow答案,提供了可用于在Kotlin中编写并发代码的工具列表。

本文的所有代码示例都可以在GitHub上获取。

结论

虽然它们不常使用,但了解和了解基本的并发工具仍然很重要。 结果,这些工作在Kotlin有点不同在Java,但所有主要机制都支持。 并记住,Kotlin与Java非常好地交互,所以如果Kotlin对应的方法丢失,你可以依靠Java类。 玩的开心!

原文链接:https://blog.csdn.net/sergeycao/article/details/53894787

原文是译文,我就直接转过来了,有的词用的不像是正常的用语,可能部分是机器翻译的,能看懂就行了,懒得改了

Kotlin进行异步操作相关推荐

  1. 深入理解 Kotlin coroutine (二)

    原文链接:https://github.com/enbandari/Kotlin-Tutorials 上周我们把 Kotlin Coroutine 的基本 API 挨个讲了一下,也给出了一些简单的封装 ...

  2. 深入理解 Kotlin Coroutine (一)

    原文链接:https://github.com/enbandari/Kotlin-Tutorials 本文主要介绍 Kotlin Coroutine 的基础 API,有关 Kotlinx.Corout ...

  3. 9.kotlin安卓实践课程-用kotlin写第一个fragment的recyclerView的adapter具体实现

    简介 主要会通过安卓实战来讲解kotlin语法和实际应用,本教程设及知识点包括框架模式mvp+mvvm, Databinding(数据绑定框架),Dagger2(依赖注入框架),DeepLink(页面 ...

  4. fun(n) Java_java程序员的kotlin课(N+2):suspending函数执行编排

    执行编排指的是对异步函数的执行顺序进行控制,举个简单的例子: 需要调用a.b两个函数,从高效的角度讲a.b并行调用有一定是最佳的,但是如果b函数的输入依赖a函数的输出,那就只能做串行调用. 针对a.b ...

  5. 《Kotlin 程序设计》第十二章 Kotlin的多线程:协程(Coroutines)

    第十二章 Kotlin的多线程:协程(Coroutines) Kotlin 1.1 introduced coroutines, a new way of writing asynchronous, ...

  6. [译] Kotlin Flow 官方 Guide 指南(2021-06-13)翻译

    原文链接:https://github.com/Kotlin/kotlinx.coroutines/blob/master/docs/topics/flow.md 文章目录 Flow 是冷流 Flow ...

  7. 十一、kotlin的协程(一)

    theme: Chinese-red 学习的前提 java线程需要大概知道点 协程是线程执行的任务, 协程和用户线程的区别在于, 协程背靠强大的编译器, 协程有专属于协程的调度器和一堆方便好用的函数, ...

  8. Kotlin入门之异步和并发

    多线程的设计,在遇到需要多个执行IO操作的时候,多个线程的阻塞,造成了效率的下降,这个时候异步就是不错的选择了. 注意:下面许多操作都是新的库,比旧的版本可能没有. 异步 协程 示例: fun mai ...

  9. 枯燥的Kotlin协程三部曲(上)——概念启蒙篇

    0x0.引言 Kotlin 1.3 版本开始引入协程 Coroutine,简练的官方文档和网上一堆浅尝辄止的文章让我心里有些没底,不想止步于仅仅知道: ① Android中,Kotlin协程用于解决: ...

最新文章

  1. linux网络命名空间详解,Linux Network Namespace (netns) 详解
  2. torch nll_loss
  3. 用mysql随机查询表a10条数据_ES简介
  4. redis 缓存击穿 看一篇成高手系列 三
  5. Cortex-M3-寄存器
  6. 字王谈M1字形与个人云字库
  7. tar压缩/解压用法
  8. 微信小程序开发——点击按钮退出小程序的实现
  9. portainer容器可视化管理部署简要笔记
  10. html5 observer api,基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作
  11. python 定义字符串变量_Python变量和字符串详解
  12. nmap扫描ipv6端口_Flan Scan:Cloudflare开源的轻量级网络漏洞扫描程序
  13. baacloud无法连接到_加入 Beta 版“Baacloud33” - TestFlight - Apple
  14. Tensorflow深度学习网络应用——英特尔神经计算棒编译
  15. netty系列之:真正的平等–UDT中的Rendezvous
  16. js 事件绑定传入自定义参数
  17. 从零开始编写minecraft光影包(8)中级水面绘制 水下阴影与焦散
  18. java 413错误,413错误——线上bug历险记
  19. 通俗解释机器学习中的召回率、精确率、准确率
  20. Linux系统概述及常用命令

热门文章

  1. spark知识点八万字长文最全汇总和高频面试题目
  2. 产品运营必须知道的几个概念,如何进行网页分析?
  3. 专题一:预处理数据(使用sklearn-preprocessing)
  4. LeetCode-双指针-88. 合并两个有序数组
  5. 流式机器学习算法的入门和认知
  6. Kafka剖析(一):Kafka背景及架构介绍--转
  7. Java元组Tuple使用实例--转载
  8. Android Studio 分析器详解
  9. python评分卡建模-卡方分箱
  10. 风控评分卡建模全流程