[Java] Thread 활용하기
- Language/JAVA
- 2022. 1. 25.
[Java] Thread 활용하기
Thread
Process(프로세스) 보다 더 작은 단위로, 한 개 이상의 스레드가 작동해야 프로세스가 작동된다.
한 프로세스 안의 복수 개의 스레드가 존재하여, 한 번의 실행으로 여러 개의 작업효과를 나타내기 위해 사용하는 기술이다.
예를 들면, 하나의 업무를 하기 위해 한 사람이 일하는 것과 여러 사람이 같은 일을 처리한다고 생각한다면 보통 여러 사람이 같이 일한다면 금방 끝날 것임을 누구나 쉽게 예측할 수 있다.
마찬가지로 스레드를 사용하고, 알아야 하는 이유는 스레드를 사용하여 작업시간의 단축에 의미를 갖는다.
그렇다면, Thread를 왜 사용할까?
Java는 보통 한 개의 스레드, 프로세스만 사용한다. 한 개의 작업이 실행되는 동안, 다른 작업의 실행은 할 수 없다.
이를 해결하기 위해 Java가 내놓은 기술이며, 이를 활용한다면 Java의 여러개의 기능을 동시에 사용할 수 있다는 장점이 생긴다.
Thread 사용 방법
스레드를 사용하기 위해서는 대표적으로 2가지 방법이 있다.
class ThreadEx1_1 extends Thread {
public void run() {
}
}
class ThreadEx1_2 implements Runnable {
public void run() {
}
}
첫 번째는 Thread를 상속받는 방법이다. Thread는 언제든지 상속이 가능한 상태이며, 이를 활용하기 위해서는 run이라는 메서드가 필요하다.
두 번째는 Runnable을 implements를 하는 방법이다.
Runnable이란, Thread를 상속받고 있는 Class이다. 따라서 이를 상속함으로써, 스레드를 사용할 수 있게 도와준다.
보통 두 번째 방법을 선호한다.
Java의 extends의 상속 방식은 하나의 Class만 가능하기 때문에, 만약 Thread를 사용하기 위해 이 한 번의 상속을 사용한다면 Java의 장점인 상속 기능의 제한이 생기기 때문이다.
그래서 Runnable을 통해 다중 상속 기능으로 Thread를 사용하고, 반드시 run을 오버 라이딩 해야한다.
Thread 생성 방법
생성자 | 설명 |
Thread() | 가장 일반적인 형태의 생성자다. 이 생성자를 이용해서 Thread 객체를 생성하게 되면 Thread의 이름은 "Thread- +n" 형태가 된다. |
Thread(Runnable target) | Runnable 객체를 이용해서 Thread 객체를 생성할 수 있는 생성자다. |
Thread(Runnable target, String name) | Runnable 객체를 이용해서 Thread 객체를 생성할 수 있는 생성자며, 스레드의 이름을 지정할 수 있는 생성자다. |
Thread(String name) | 스레드의 이름을 지정하면서 Thread 객체를 생성 할 수 있는 생성자다. |
Thread의 생성을 활용하여, Thread의 이름을 지정할 수 있게 도와준다.
Thread의 생명주기
Thread의 생명주기는 크게 5가지로 나뉘어진다.
상태 | 설명 |
New | 스레드가 만들어진 상태 |
Runnable | 스레드 객체가 생성된 후에 start() 메서드를 호출하면 Runnable 상태로 이동된다. |
Running | Runnable 상태에서 스레드 스케줄러에 의해 Running 상태로 이동하게 된다. |
Blocked | 스레드가 다른 특정한 이유로 Running 상태에서 Blocked 상태로 이동하게 된다. |
Dead | 스레드가 종료되면 그 스레드는 다시 시작할 수 없게 된다. |
Thread의 주요 메서드
메서드 | 반환형 | 설명 |
sleep(long millis) | static void | 지정된 시간만큼 대기시킨다. (1초 = 1000) |
getName() | String | 스레드의 이름을 반환한다. |
setName(String name) | void | 스레드의 이름을 변경한다. |
start() | void | 스레드를 시작한다. |
getPriority() | int | 스레드의 우선순위를 반환한다. |
setPriority(int new Priority) | void | 스레드의 우선순위를 지정한다. |
join() | void | 현재 스레드는 join() 메서드를 호출한 스레드가 종료할 때까지 기다려야 한다. |
yield() | static void | 수행중인 스레드 중 우선순위가 같은 다른 스레드에게 제어권을 넘겨준다. |
currentThread() | static Thread | 현재 수행되는 스레드 객체를 리턴한다. |
Thread에서 주로 사용하는 메서드이다.
이 중, 가장 대표적으로 종종 사용하는 것은 메서드 sleep이다.
Thread.sleep(1000); - 입력 시, 1초간 동작을 멈춘다.
Thread 사용 비교하기
1. 평상시 사용방법
평상시처럼 Java를 이용해서 for문을 동작시키면 위와 같은 결과가 나온다.
첫 번째의 for문이 끝나기 전까지 두 번째의 for문은 동작하지 않는다.
2. 스레드 사용방법
Thread의 기능을 활용하여, 각 Thread마다 for문 한 개씩 전달하였다. 콘솔 값은 놀랍게도 0과 1이 뒤섞인 모습을 알 수가 있다.
실행된 Thread는 우선순위가 없으므로 실행되는 순서와 결과값은 실행 때마다 다르게 나타난다.
그러나 알 수 있는 것은, 0을 500개, 1을 500개 출력하는 과정을 동시에 처리했다는 것을 알 수 있다.
마무리
Thread를 사용하는 것은 동시에 여러가지 작업을 진행하기 위함이다.
그러나 이를 사용한다해서 시간소요가 줄어들지 않고 오히려 늘어난다.
'Language > JAVA' 카테고리의 다른 글
[Java] FCM Push 전송하기, json Version (0) | 2022.05.12 |
---|---|
[Java] Cookie 활용하기 (0) | 2022.05.10 |
Java, 메모장 파일 만들기 (0) | 2021.10.10 |
[Java] 자바 Stack 클래스 사용 방법 (0) | 2021.10.08 |
[Java] List의 toArray 사용하기 (List를 Array로 형변환 시키기) (0) | 2021.01.11 |