ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.