쓰레드는 프로세스 내에서 실제로 작업을 수행하는 실행 단위입니다. 쓰레드를 이용하면 하나의 프로세스 내에서 여러 작업을 동시에 처리할 수 있습니다. 이를 통해 CPU 사용률을 최적화하고, 자원을 효율적으로 사용할 수 있습니다.
자바에서 쓰레드를 생성하는 주요 방법은 두 가지입니다:
1. Thread
클래스를 상속받아 run()
메서드를 오버라이드하는 방법
2. Runnable
인터페이스를 구현하는 방법
두 경우 모두, run()
메서드에 쓰레드가 수행할 작업을 정의합니다. Thread
클래스의 start()
메서드를 호출하면 새로운 쓰레드가 시작되고, 해당 쓰레드에서 run()
메서드가 호출됩니다.
만약 쓰레드의 생성 개수가 무수히 많이 늘어나게 될 경우, 쓰레드가 서버에 처리 단위가 많아지게 되어 서버에 과부화가 발생할 수 있습니다. 이를 해결하기 위해, 쓰레드 풀을 이용하여 서버의 과부화를 줄일 수 있습니다.
ExecutorService
는 쓰레드 풀을 관리하는 인터페이스입니다. 쓰레드 풀은 미리 생성된 쓰레드의 집합으로, 이를 재사용함으로써 쓰레드 생성과 소멸에 따른 비용을 줄일 수 있습니다. ExecutorService
는 작업을 쓰레드에 배치하고, 쓰레드의 생명 주기를 관리합니다.
ExecutorService
의 주요 메서드 중 하나는 execute()
로, Runnable
객체를 인수로 받아 쓰레드 풀에서 처리하도록 합니다.
Executors
클래스의 여러 팩토리 메서드 중 하나를 이용하여 ExecutorService
인스턴스를 생성합니다. 이를테면, Executors.newFixedThreadPool(n)
메서드는 크기가 고정된 n
개의 쓰레드를 가진 쓰레드 풀을 생성합니다.
그런 다음, execute()
메서드를 사용하여 Runnable
객체를 쓰레드 풀에 제출합니다. 이때, Runnable
객체의 run()
메서드는 쓰레드 풀의 쓰레드 중 하나에서 실행됩니다.
ExecutorService executorService = Executors.newFixedThreadPool(10);
executorService.execute(new MyRunnable());
이렇게 ExecutorService
를 사용하면, 쓰레드 생명 주기를 직접 관리하지 않고도 쓰레드를 효과적으로 활용할 수있습니다.