본문 바로가기

Programming Language/Java & Scala

스레드풀(Thread Pool)이란? 종류, 설명

자바에서 스레드를 생성하고 제거하며, 다수의 스레드를 관리할 수 있도록 자바에는 java.util.concurrent.Executors 를 통해 스레드풀 기능을 제공하고 있습니다.

public class Executors {
    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
    ...

 

 

스레드풀의 종류

- newFixedThreadPool : 주어진 스레드 개수만큼 생성하고 그 수를 유지. 생성된 스레드 중 일부가 종료되었으면 스레드를 다시 생성.

- newCachedThreadPool : 처리할 스레드가 많아지면 그만큼 스레드를 증가(최대 스레드 개수 : Integer.MAX_VALUE)

- newSingleThreadExecutor : 스레드를 하나만 생성(1개로 계속 유지)

- newScheduledThreadPool : 특정 시간 이후, 또는 주기적 작업 스레드 사용시 활용

스레드풀 사용방법(in scala)

newCachedThreadPool의 사용예제 코드입니다. callable로 선언한 class에 대해 submit 명령어로 thread를 추가할 수 있습니다.

// runnable class submit
val runnerThread = new CustomThreadRunner()
val executionService = Executors.newCachedThreadPool(new WorkerThreadFactory())
executionService.submit(runnerThread)

....
// Thread 이름을 지정하기 위한 Factory
class WorkerThreadFactory() extends ThreadFactory {
  private var counter: Int = 0
  override def newThread(r: Runnable): Thread = {
    val threadName = s"Thread/${counter}"
    counter += 1
    new Thread(r, threadName)
  }
}

....
// 실제 working thread runner
class CustomThreadRunner() extends Callable[String] {
  private var isRunning: Boolean = true
  override def call(): String = {
  
  	
    while (runner.isRunning) {
  		println("running") //무한루프로 스레드가 종료되지 않고 지속적으로 처리
    }        
    "run"
  }
  def stop() = {
  	println("stop")
  }
}

....
// Stop runnable thread
runnerThread.stop()

스레드풀을 정지할때 flag를 사용하였습니다. flag를 사용할 경우 즉시 thread가 죽지 않는다는 이슈가 있긴하지만 만약 데이터 처리 등 중요처리가 intrrupt가 되면 안될 경우 유용합니다. flag를 통해 스레드가 중지되어야 함을 알게되고, 해당 스레드가 종료되기위한 순차적인 작업을 진행하면 되기 때문입니다.

반응형