thread는 프로세스내에서 실질적인 작업을 실행하는 단위이며, 자바에서는 JVM의해 관리됩니다.
프로세스에는 최소 한개이상의 thread가 존재하며, Main thread하나로 시작하여 추가 생성이 진행되면서 멀티 스레드 환경이 됩니다.
Process?
프로세스(process)는 일반적으로 CPU에 의해 자원 할당을 받아 실행중인 프로그램을 말하며, 자신만의 메모리 공간을 포함한 독립적인실행 환경을 갖고 있습니다.
JVM?
Java Virtual Machine의 줄임말이며, JVM은 OS에 종속 되지 않고 CPU가 JAVA를 인식하여 실행할 수 있게끔 하는 가상환경입니다.
Java에서 스레드 작업을 실행하기 위한 "실행 단위"입니다. 기본적으로 Java에서는 싱글 스레드로 시작하여 main메서드에서 Main스레드가 동작합니다.
Java는 멀티 스레드를 지원하여 하나의 프로세스 안에 한개 이상의 스레드를 지원하는 구조를 가질 수 있습니다.
각 영역을 살펴보자면 다음과 같습니다.
-동적 할당된 메모리가 저장되는 영역입니다.
하나의 프로세스 내에서 하나의 스레드만을 사용하여 실행되는 환경을 말합니다. 싱글 스레드는 순차적으로 작업을 처리하며 현재 처리중인 작업이 종료되기 전까지 다음 작업을 실행하지 않습니다.
하나의 task만 처리할 수 있어 처리량이 낮아지는 단점이 존재합니다.
하나의 프로세스 내에서 하나 이상의 스레드가 실행되는 환경을 말합니다. 멀티스레드는 병행실행을 통해 동시에 여러 작업을 수행하므로 작업의 효율이 높습니다.
동시에 여러 작업을 수행하기 때문에 스레드간 동기화 문제가 있을 수 있습니다.
구분 | 단일 스레드 (Single Thread) | 멀티 스레드 (Multi Thread) |
---|---|---|
처리 속도 | 느림 | 빠름 |
성능 | 낮음 | 높음 |
CPU 활용 | 낮음 | 높음 |
병목현상 | 발생 | 완화 |
안정성 | 높음 | 낮음 |
디버깅 | 쉬움 | 어려움 |
코딩 | 간단 | 복잡 |
확장성 | 낮음 | 높음 |
효율성 | 낮음 | 높음 |
예측성 | 높음 | 낮음 |
비용 | 낮음 | 높음 |
메서드 | 설명 |
---|---|
start() | 스레드를 시작한다 |
run() | 작업을 정의한다 |
sleep(long millis) | 현재 스레드를 시간만큼 중지 |
yield() | 실행 스레드 변경 |
join() | 다른 스레드 종료될 때까지 현재 스레드 일시 정지 |
isAlive() | 실행 여부 확인 |
setName(String str) | 이름 지정 |
getName() | 이름 반환 |
setPriority() | 우선순위 지정 |
getPriority() | 우선순위 반환 |
interrupt() | 작업 중단 |
Thread관련 Object 메서드
wati()
: 현재 스레드를 일시중시하고 다른 스레드가notify()
또는notifyAll()
메서드 호출전까지 대기상태로 변경합니다.notify()
:wati()
의해 중지된 스레드 중 하나를 실행대기 상태로 변경합니다.notifyAll()
:wati()
의해 중지된 모든 스레드를 실행대기 상태로 변경합니다.
자바에서 스레드를 생성하는 방법은 크게 두가지로 분류됩니다.
public MyThread extends Tread{
@override
public void run(){
System.out.println("스레드를 시작합니다")
}
}
public class main{
public static void main(String[] agrs) {
MyThread thr = new MyThread();
thr.start(); //스레드 시작
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("스레드를 시작합니다")
}
}
public class Main {
public static void main(String[] args) {
Thread thread1 = new Thread(new MyRunnable());
thread1.start(); // 스레드 시작
}
}
Thread 클래스 내부를 살펴보면 Thread는 Runnable을 구현하고 있는 것을 확인 할 수 있습니다.
public class MultiThread extends Thread{
int seq; //시퀀스 정의
public MultiThread(int seq){
this.seq = seq;
}
@Override
public void run(){
System.out.println(seq + "번째 스레드 실행");
try{
Thread.sleep(10000);
}catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(seq + "번째 스레드 종료");
}
public class main {
public static void main(String[] args){
for(int i = 1; i<= 10; i++){
MultiThread thread = new MulitThread(i);
//스레드 시작
thread.start();
}
System.out.println("메인 스레드 종료");
}
}