Kotlin通过封装Java的线程类,简化了线程 *** 作。
可以使用特定的注解,直接使用Java的同步关键字等。
Kotlin中没有 synchronized、volatile关键字;
Kotlin的Any类似于Java的Object,但是没有 wait()、notify()、notifyAll() 方法。
- 使用对象表达式创建线程
- 使用Lambda表达式创建线程
- 使用Kotlin封装的 thread() 函数创建线程
// object 对象表达式,创建一个匿名类,并重写 run() 方法 object : Thread() { override fun run() { sleep(200) val line = currentThread() println("使用 Thread 对象表达式: $line") // 输出:使用 Thread 对象表达式: Thread[Thread-0,5,main] } }.start()
// 使用Lambda表达式,将Runnable对象传给新创建的Thread对象 val t0 = Thread { Thread.sleep(800) val line = Thread.currentThread() println("使用Lambda表达式: $line") // 输出:使用Lambda表达式: Thread[myThread,3,main] } t0.isDaemon = false t0.name = "myThread" t0.priority = 3 t0.start()
Kotlin将这样的 *** 作 封装简化(简化了样板代码):
// 使用Kotlin封装的 thread() 函数创建线程 thread(start = true, isDaemon = false, name = "myThread_x",priority = 3) { Thread.sleep(1000) val line = Thread.currentThread() println("使用Kotlin封装的 thread() 函数: $line") // 输出:使用Kotlin封装的 thread() 函数: Thread[myThread_x,3,main] }
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 = true if (priority > 0) thread.priority = priority if (name != null) thread.name = name if (contextClassLoader != null) thread.contextClassLoader = contextClassLoader if (start) thread.start() return thread }同步方法、同步块
@Synchronized fun appendFileBytesF(array: ByteArray, destFile: String): Unit { val f = File(destFile) if (!f.exists()) { f.createNewFile() } f.appendBytes(array) }
fun appendFileBytesSync(array: ByteArray, destFile: String): Unit { val f = File(destFile) if (!f.exists()) { f.createNewFile() } synchronized(mLock) {f.appendBytes(array)} }可变字段
Kotlin中没有 volatile 关键字,但是有 @Volatile 注解
// 注解@Volatile 会将JVM备份字段标记为 volatile @Volatile private var running = false fun tStart(): Unit { running = true thread(start = true) { var count = 0 while (running) { Thread.sleep(100) count++ val line = Thread.currentThread() println("running: $line {$count}") } } } fun tStop(): Unit { running = false val line = Thread.currentThread() println("stopped: $line") } // 测试 fun testVolatile(): Unit { thread(start = true) { tStart() Thread.sleep(1200) tStop() } }
Kotlin中还有更好用的 协程并发库。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)