개발
Java - Thread start, run
kwony
2023. 2. 28. 19:00
start(), run()의 차이
둘다 쓰레드를 실행하기 위한 함수다. 그러나 run() 을 사용하면 run을 호출한 쓰레드에서 작업이 처리되고 start()를 사용하면 쓰레드를 새로 만들어서 처리된다. 병렬 처리를 하고 싶다면 start()를 사용해야 한다.
fun main() {
ThreadTest().runThread()
}
class ThreadTest {
var counter = 0;
private fun increaseCounter() {
counter++
}
fun runThread() {
val threads = ArrayList<Thread>()
(1..100).map { number ->
val thread = Thread {
sleep((Math.random() * 1000).toLong())
println("${Thread.currentThread().name} done, number: $number")
}
threads.add(thread)
}
threads.forEach { thread ->
thread.run()
}
}
}
----------------------------------------------------------------------
main done, number: 1
main done, number: 2
main done, number: 3
main done, number: 4
main done, number: 5
runThread() 함수에서 랜덤한 시간동안 sleep을 거친후 작업을 처리중인 쓰레드의 이름과 생성 number를 출력하도록 했다. 그 결과 모두 main함수에서 처리됐고 1 부터 5까지 순서대로 출력됐다. 병렬로 처리됐다면 딜레이 시간이 달랐기 때문ㅇ[ 출력되는 순서가 달랐어야 할텐데 그렇지 않은 것으로 보아 위 코드는 병렬로 처리되지 않았다.
똑같은 코드에서 쓰레드 호출 부분만 start()로 변경했다.
fun runThread() {
val threads = ArrayList<Thread>()
(1..100).map { number ->
val thread = Thread {
sleep((Math.random() * 1000).toLong())
println("${Thread.currentThread().name} done, number: $number")
}
threads.add(thread)
}
threads.forEach { thread ->
thread.start()
}
}
----------------------------------------------------------------------
Thread-8 done, number: 9
Thread-76 done, number: 77
Thread-80 done, number: 81
Thread-92 done, number: 93
Thread-22 done, number: 23
Thread-53 done, number: 54
그 결과 작업을 처리중인 쓰레드 이름이 모두 다르고 number값도 섞였다. start()로 실행 할 때는 새로운 쓰레드를 생성해서 처리하기 때문에 처리하는 쓰레드 이름도 다르고 작업도 병렬로 진행된다.