-
Java - Thread start, run개발 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()로 실행 할 때는 새로운 쓰레드를 생성해서 처리하기 때문에 처리하는 쓰레드 이름도 다르고 작업도 병렬로 진행된다.
'개발' 카테고리의 다른 글
coroutine - launch, async, CoroutineContext (0) 2023.02.28 kubernetes - readiness, livenesss, startup probe (0) 2023.02.28 Java - synchronized, wait, notify (0) 2023.02.28 자바 - Garbage Collector (0) 2023.02.24 JAVA - 직렬화, 역직렬화 (0) 2023.02.24