자바에서 스레드를 생성하고 제거하며, 다수의 스레드를 관리할 수 있도록 자바에는 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를 통해 스레드가 중지되어야 함을 알게되고, 해당 스레드가 종료되기위한 순차적인 작업을 진행하면 되기 때문입니다.
반응형
'Programming Language > Java & Scala' 카테고리의 다른 글
sbt 실행시 '/modules/java.base/java/lang/String.class' is broken 이슈 해결 방법 (0) | 2020.05.25 |
---|---|
Java GC 종류별 도식화 (1) | 2020.03.08 |
Java PermGen의 역사 (1) | 2020.03.07 |
JVM 버젼별 Scala 하위호환표(JDK Compatibility for scala) (0) | 2020.02.18 |
DateTimeFormatter에서 년도표시에 yyyy대신 uuuu를 사용해야하는 이유? (0) | 2019.11.21 |
Spring boot Resttemplate 사용시 HttpComponentsClientHttpRequestFactory 옵션 설명(setConnectTimeout, setConnectionRequestTimeout, setReadTimeout) (393) | 2019.06.28 |