Checkpoint synchronization: Difference between revisions

Added Kotlin
(Added Kotlin)
Line 1,375:
Worker 2 is ready
Task 3 complete</pre>
 
=={{header|Kotlin}}==
{{trans|Java}}
<lang scala>// Version 1.2.41
 
import java.util.Random
 
val rgen = Random()
var nWorkers = 0
var nTasks = 0
 
class Worker(private val threadID: Int) : Runnable {
 
@Synchronized
override fun run() {
try {
val workTime = rgen.nextInt(900) + 100L // 100..999 msec.
println("Worker $threadID will work for $workTime msec.")
Thread.sleep(workTime)
nFinished++
println("Worker $threadID is ready")
}
catch (e: InterruptedException) {
println("Error: thread execution interrupted")
e.printStackTrace()
}
}
 
companion object {
private var nFinished = 0
 
@Synchronized
fun checkPoint() {
while (nFinished != nWorkers) {
try {
Thread.sleep(10)
}
catch (e: InterruptedException) {
println("Error: thread execution interrupted")
e.printStackTrace()
}
}
nFinished = 0 // reset
}
}
}
 
fun runTasks() {
for (i in 1..nTasks) {
println("\nStarting task number $i.")
// Create a thread for each worker and run it.
for (j in 1..nWorkers) Thread(Worker(j)).start()
Worker.checkPoint() // wait for all workers to finish the task
}
}
 
fun main(args: Array<String>) {
print("Enter number of workers to use: ")
nWorkers = readLine()!!.toInt()
print("Enter number of tasks to complete: ")
nTasks = readLine()!!.toInt()
runTasks()
}</lang>
 
{{output}}
Sample session:
<pre style="height: 200px;overflow:scroll">
Enter number of workers to use: 5
Enter number of tasks to complete: 3
 
Starting task number 1.
Worker 1 will work for 894 msec.
Worker 3 will work for 777 msec.
Worker 2 will work for 243 msec.
Worker 4 will work for 938 msec.
Worker 5 will work for 551 msec.
Worker 2 is ready
Worker 5 is ready
Worker 3 is ready
Worker 1 is ready
Worker 4 is ready
 
Starting task number 2.
Worker 2 will work for 952 msec.
Worker 3 will work for 253 msec.
Worker 1 will work for 165 msec.
Worker 4 will work for 995 msec.
Worker 5 will work for 499 msec.
Worker 1 is ready
Worker 3 is ready
Worker 5 is ready
Worker 2 is ready
Worker 4 is ready
 
Starting task number 3.
Worker 1 will work for 622 msec.
Worker 2 will work for 642 msec.
Worker 4 will work for 344 msec.
Worker 3 will work for 191 msec.
Worker 5 will work for 703 msec.
Worker 3 is ready
Worker 4 is ready
Worker 1 is ready
Worker 2 is ready
Worker 5 is ready
</pre>
 
=={{header|Logtalk}}==
9,486

edits