Java의 스레드 프로그래밍
- 스레드 생성, 실행
- 단일 스레드
- 멀티 스레드
- 스레드 상채변화
- 스레드 동시성 제어
스레드 생성,실행
java에서의 스레드 구현
- Thread 클래스 상속
- 자바에서 지원하는 Thread 클래스를 상속하여 구현하는 것을 말한다.
- Thread 클래스의 경우 Runnable을 구현하여 정의했다.
- 한 번만 사용할거라면 따로 객체 생성 없이 사용이 바로 가능하다(상속을 했기 때문 Runnable 인터페이스 구현은 무조건 객체 생성 후 사용해야 한다.)
- Runnable 인터페이스 구현
- Runnable 인터페이스를 구현하는 방식도 쓰레드의 생성, 실행 방법 중 하나다.
- Thread 클래스 역시 Runnable 인터페이스를 구현하여 정의되었다.
Thread 클래스 상속에 의한 구현
package extendsThread;
import java.util.concurrent.ExecutionException;
public class ExtendsThread extends Thread{
private String message;
private int loopCount;
public ExtendsThread(String message){
this.message = message;
this.loopCount = 0;
}
@Override
public void run() {
while (!Thread.interrupted()){
try{
++this.loopCount;
System.out.println(this.message +" : "+ this.loopCount);
Thread.sleep((long)(Math.random()*1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ExtendsThread thread1 = new ExtendsThread("one");
ExtendsThread thread2 = new ExtendsThread("two");
ExtendsThread thread3 = new ExtendsThread("three");
thread1.start();
thread2.start();
thread3.start();
}
}
- Thread를 상속받아 구현하였고 수행하는 동안에 주어진 메시지를 무한 출력하도록 했다.
Runnable 인터페이스 구현
package implementsThread;
public class RunnableThread implements Runnable{
private String message;
private int loopCount;
public RunnableThread(String message){
this.message= message;
this.loopCount = 0;
}
@Override
public void run() {
while (Thread.interrupted()) {
try {
++this.loopCount;
System.out.println(message + " : " + this.loopCount);
Thread.sleep((long)(Math.random()*1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Thread thread1 = new Thread(new RunnableThread("one"));
Thread thread2 = new Thread(new RunnableThread("two"));
Thread thread3 = new Thread(new RunnableThread("three"));
thread1.start();
thread2.start();
thread3.start();
}
}
- Runnable 인터페이스를 구현하였고 Thead 객체를 통해 구현한 객체를 생성하여 사용한다.
- 수행하는 동안에 주어진 메시지를 무한 출력하도록 했다.
Class Thread VS Interface Runnable
Thread 클래스의 상속을 통해 구현할 경우
- 자바는 다중 상속을 지원하지 않기 때문에 다른 클래스의 상속이 불가하다.
- 객체 생성 후 바로 실행이 가능하다.
Runnable 인터페이스의 구현을 통해 구현할 경우
- 다른 클래스에서 상속을 통해 구현이 가능하다.
- 객체 생성 후 바로 사용할 수 없고 추가적인 Thread 객체가 요구된다.
- Thread thread3 = new Thread(new RunnableThread("three")); -> 추가적인 Thread 객체가 요구된 경우
단일 스레드
- Main 스레드에서 작업을 진행하며 작업은 순차적으로 진행한다.
- 하나의 프로세스에서 오직 하나의 스레드만 실행하는 것을 의미한다.
- 단일 레지스터와 스택으로 구성
- Context Switching 작업을 요하지 않는다.
- 동시성 제어에 대한 처리를 신경쓰지 않아도 된다.
멀티 스레드
- 프로그램 내에서 두 개 이상의 동작을 동시에 실행한다.
- 프로세서의 활동을 극대화
- 두개의 동작을 동시에 실행
- 하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유한다.
- 자원의 생성과 관리의 중복성을 최소화한다.
- 수행 능력을 향상시킨다.
스레드 상태
- New: 스레드가 실행 준비를 완료한 상태로, start() 메소드를 호출하기 전 상태
- Runnable: start()가 호출되어 실행될 수 있는 상태 Wait 다른 스레드가 통지할 때 까지 기다리는 상태
- Timed_wait: 정해진 시간동안 기다리는 상태
- Blocked: 사용하고자 하는 객체의 잠금(lock)이 풀릴 때까지 대기하는 상태
- Terminated: 실행이 종료된 상태
스레드 상태 전이
스레드는 내부 동작에 의해 상태가 변경되거나 외부적 요처엥 의해 상태 변경이 가능하다.
'Back-End > 백엔드 관련 정리' 카테고리의 다른 글
[자바][List] - 리스트 인터페이스를 사용해 직접 LinkedList 클래스를 구현해보자 (0) | 2022.09.18 |
---|---|
[자바][List] - 인터페이스 기반 프로그래밍 (0) | 2022.09.17 |
[백엔드 과정][자바 기초] - 프로세스 (0) | 2022.09.06 |
[백엔드 과정][자바 기초] - 큐 구현하기 (3.DoubleLinkedList를 이용한 구현) (0) | 2022.09.06 |
[백엔드 과정][자바 기초] - 큐 구현하기 (2. LinkedList를 이용한 구현) (0) | 2022.09.06 |