Kotlinのコンカレント原語


Concurrency Primitives in Kotlin(Kotlinのコンカレント原語)
私は最近G.Blake Meikeの“Android Concurrency”を読み始めて、今まで、私はこの偉大な本を強くお勧めすることができます:それは多くの洞察がどのように各種のAndroidの同時メカニズムの仕事を含んで、いつ1種の方法が好きで、およびどのように最も良いツールを獲得して、あなたの処置にあります.コードの例に従い、パソコンで再作成することにしました.Kotlinが大好きなので、サンプルをKotlinに変換するのは良いアイデアだと思います.Kotlinのコード例を書き換え始めたとき、KotlinにsynchronizedキーワードKotlinにvolatileキーワードKotlinがないAnyはJavaのObjectに似ていて、wait()がなく、notify()とnotifyAll()メソッドがないことに驚きました.では、Kotlinでどのように動作しますか.この質問はKotlinフォーラムで提出されました.ここではAndrey Breslav、Kotlinプロジェクトの責任者からの答えです.Kotlinは故意に同時言語を内蔵していない構造です.これは図書館が処理すべきだと思います.Kotlinにはこれらの内蔵言語はありませんが、低レベルの同時ツールを提供しています.お店に何があるか見てみましょう.
スレッドの作成
Javaでスレッドを作成するには、Threadクラスを拡張するか、インスタンス化してコンストラクション関数を介してRunnableを渡す2つの方法があります.KotlinでJavaクラスを簡単に使用できるので、どちらのソリューションも優れています.ここではあなたがどのようにしていますか?
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 = 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 Kotlin , @Synchronizedannotation。 Kotlin :
@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 = false

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

fun stop() {  
  running = false
  println("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 。 !