Google AdSense (text)

hidden logo stop

Moving

거지 같은 이글루스 광고노출 정책이 싫어서,
새 보금자리(http://blog.leocat.kr/)로 이사감.

[Groovy] 간단하게 만드는 thread Computer & Program

Java에서 간단한 thread를 만들려면 Runnable을 상속받아 void run() 메소드를 오버라이드 해주면 된다. Groovy도 비슷하게 thread를 만들 수 있다. void run()에서 실행할 내용을 closure로 만들어서 넘겨주면 된다.

아주 간단한 thread 예제
println 'before'
Thread.start {
    3.times {
        sleep 10
        println "in thread: ${it}"
    }
}
println 'after'

before
after
in thread: 0
in thread: 1
in thread: 2


Groovy doc에 아주 멋진 예제가 나와있다. 짧으면서도 싱크까지 다 설명된..
import java.util.concurrent.atomic.AtomicInteger

def counter = new AtomicInteger()

synchronized out(message) {
    println(message)
}

def th = Thread.start {
    for( i in 1..8 ) {
        sleep 30
        out "thread loop $i"
        counter.incrementAndGet()
    }
}

for( j in 1..4 ) {
    sleep 50
    out "main loop $j"
    counter.incrementAndGet()
}

th.join()

assert counter.get() == 12

thread loop 1
main loop 1
thread loop 2
main loop 2
thread loop 3
thread loop 4
main loop 3
thread loop 5
main loop 4
thread loop 6
thread loop 7
thread loop 8

메인 thread 이외에 th thread가 존재하며, 동시에 for문을 빙글빙글 돌면서 화면에 글씨를 찍는다. 그리고 각 thread는 counter라는 객체를 공유하고 있다. 공유 객체는 AtomicInteger로 increment나 add 등의 동작이 동기화처리되기 때문에 여러 thread에서 함께 사용해도 문제가 없이 마지막에는 12로 끝나게 된다.



그리고 이건 심심해서 만들어본 예제이다.
def getWorker (name, til) {
    return {
        for(i in 0..til) {
            sleep 30
            println "${name}: ${i}"
        }
    }
}

3.times { i ->
    Thread.start(getWorker("Thread #${i}", i))
}

Thread #1: 0
Thread #2: 0
Thread #0: 0
Thread #1: 1
Thread #2: 1
Thread #2: 2

Thread로 실행할 closure를 함수를 통해 받는다. 생성된 3개의 thread는 모두 다른 행동을 한다.


- 참고
Groovy - Concurrency with Groovy

덧글

댓글 입력 영역

Google AdSense (text/image)