Kotlin我爱编程全面基础

kotlin 线程基础

2018-07-24  本文已影响29人  请输入妮称

1.创建线程

在 kotlin中,有三种方式可以创建线程
1.继承Thread类

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

2.使用Runnable类初始化Thread对象。

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

这里我们并没有看到,Runnable对象。其实是被lambda表达式替换了。

3.使用kotlin提供的封装方法

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

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
}

2.线程锁

在java中,给方法加锁一般是使用synchronized关键字,但是在kotlin中,并没有这个关键字,取而代之的是@Synchronized注解。

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

如果是给代码块加锁,则使用synchronized()方法

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

3.wait(), notify() and notifyAll()

kotlin的基类是Any,类似于java中的Object,但是没有提供wait()、notify()、notifyAll()方法。但是我们依然可以通过创建Object的实例,从而调用wait()、notify()、notifyAll()方法。

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()
}

4.线程相关第三方库

kotlin并不打算在语言层面对线程方面做过多的设计,而是将其转嫁到第三方库上。

1.Kovenant library
kotlin中的promise。

2.Quasar library
暂时没有研究,有兴趣可自行观看,轻量级的线程和协程实现

5.当inline遇到synchronized

这里存在一些问题,当inline修饰的方法加入@Synchronized注解后,那么当inline方法被调用的时候,synchronized锁机制将会消失。

class AA {
    companion object {
        private var str = "test"
        @JvmStatic
        fun main(args: Array<String>?) {
            synchronizedAnnotationMethod()
        }

        private @Synchronized
        inline fun synchronizedAnnotationMethod() {
            print(str)
        }
    }
}

反编译后的代码

    @JvmStatic
    public final void main(@Nullable String[] args) {
        AA.Companion this_$iv = this;
        Object object = this_$iv.getStr();
        System.out.print(object);
    }

    private final synchronized void synchronizedAnnotationMethod() {
        String string = this.getStr();
        System.out.print((Object)string);
    }

可以看到内联之后,synchronized消失

上一篇下一篇

猜你喜欢

热点阅读