개발

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()로 실행 할 때는 새로운 쓰레드를 생성해서 처리하기 때문에 처리하는 쓰레드 이름도 다르고 작업도 병렬로 진행된다.