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クラスを簡単に使用できるので、どちらのソリューションも優れています.ここではあなたがどのようにしていますか?
このコードはKotlinのオブジェクト式を使用して匿名クラスを作成しrun()メソッドを上書きします.次に、Runnableを新しく作成したThreadインスタンスに渡す方法を示します.
ここではRunnableは見えません:Kotlinではlambda式に簡単に置き換えることができます.もっと良い方法はありますか?もちろん!スレッドKotlinスタイルをインスタンス化して起動する方法は、次のとおりです.
きれいですね.すべてのテンプレートコードを不思議に隠すthread()関数を使用しています.実際、thread()には魔法はありません.
これは非常に便利な包装関数にすぎず、楽しく使用できます.
同期メソッドとブロック
私は最近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 。 !