반응형
Thread 란?
- 하나의 프로세스 내부에서 독립적으로 실행되는 하나의 작업 단위.
Multi Thread 란?
- 여러개의 Thread를 동시에 실행시키는 것
- 장점 : 동시에 여러가지 작업 처리 가능 + 자원을 더 효율적으로 사용 가능
- 단점 : 서로 자원을 사용하다 충돌할 수 있음 + SingleThread보다 더 느린 상황도 있음
Thread 구현 방법
- Thread 클래스를 상속받아 구현
- Runnable 인터페이스를 구현
- JAVA에서는 다중 상속을 허용하지 않기 때문에 다른 부모클래스를 상속받아 Thread를 구현해야 하는 상황이 존재할 수 있으므로 이럴때는 2번 방법이 더 효율적임
Single Thread 예제 1 - Thread 클래스 상속
package ThreadTest;
public class SingleThread01 extends Thread{
private int time;
private String message;
public SingleThread01(String message, int time) {
this.message = message;
this.time = time;
System.out.println("싱글스레드 01 시작!");
}
public void run() {
for(int i = 1 ; i <= 5 ; i ++) {
try {
Thread.sleep(time);
System.out.println(message + " " + i + "번째 실행중");
} catch(Exception e) {
e.printStackTrace();
}
}
System.out.println("끝!");
}
public static void main(String[] args) {
SingleThread01 st = new SingleThread01("싱글스레드 01", 1000); // 1000은 1000ms(1초) 의미
st.start();
}
}
결과
싱글스레드 01 시작!
싱글스레드 01 1번째 실행중
싱글스레드 01 2번째 실행중
싱글스레드 01 3번째 실행중
싱글스레드 01 4번째 실행중
싱글스레드 01 5번째 실행중
끝!
- 시작 후 1초에 1번씩 실행됨
Single Thread 예제 2 - Runnable 인터페이스 구현
package ThreadTest;
public class SingleThread02 implements Runnable {
private int time;
private String message;
public SingleThread02(String message, int time) {
this.message = message;
this.time = time;
System.out.println("싱글스레드 02 시작!");
}
public void run() {
for(int i = 1 ; i <= 5 ; i ++) {
try {
Thread.sleep(time);
System.out.println(message + " " + i + "번째 실행중");
} catch(Exception e) {
e.printStackTrace();
}
}
System.out.println("끝!");
}
public static void main(String[] args) {
SingleThread02 st = new SingleThread02("싱글스레드 02", 1000);
Thread t = new Thread(st); // 이 부분이 Thread 상속 방법과 다름
t.start();
}
}
결과
싱글스레드 02 시작!
싱글스레드 02 1번째 실행중
싱글스레드 02 2번째 실행중
싱글스레드 02 3번째 실행중
싱글스레드 02 4번째 실행중
싱글스레드 02 5번째 실행중
끝!
- 시작 후 1초에 1번씩 실행됨
Multi Thread 예제 - 두 방식 모두 사용
< MultiThread.java >
package ThreadTest;
public class MultiThread {
public static void main(String[] args) {
System.out.println("메인함수 실행");
// thread 01, 02는 Thread 상속 방식으로
// thread 03, 04는 Runnable 구현 방식으로 생성
// 각각의 시간을 다르게 설정하였음
Thread thread01 = new SingleThread01("쓰레드01", 1000);
Thread thread02 = new SingleThread01("쓰레드02", 2000);
SingleThread02 st1 = new SingleThread02("쓰레드03", 3000);
SingleThread02 st2 = new SingleThread02("쓰레드04", 4000);
Thread thread03 = new Thread(st1);
Thread thread04 = new Thread(st2);
thread01.start();
thread02.start();
thread03.start();
thread04.start();
System.out.println("메인함수 종료");
}
}
< SingleThread01.java >
package ThreadTest;
public class SingleThread01 extends Thread{
private int time;
private String message;
public SingleThread01(String message, int time) {
this.message = message;
this.time = time;
System.out.println(message + " 시작!");
}
public void run() {
for(int i = 1 ; i <= 3 ; i ++) {
try {
Thread.sleep(time);
System.out.println(message + " " + i + "번째 실행중");
} catch(Exception e) {
e.printStackTrace();
}
}
System.out.println(message + " 끝!");
}
}
< SingleThread02.java >
package ThreadTest;
public class SingleThread02 implements Runnable {
private int time;
private String message;
public SingleThread02(String message, int time) {
this.message = message;
this.time = time;
System.out.println(message + " 시작!");
}
public void run() {
for(int i = 1 ; i <= 3 ; i ++) {
try {
Thread.sleep(time);
System.out.println(message + " " + i + "번째 실행중");
} catch(Exception e) {
e.printStackTrace();
}
}
System.out.println(message + " 끝!");
}
}
결과
메인함수 실행
쓰레드01 시작!
쓰레드02 시작!
쓰레드03 시작!
쓰레드04 시작!
메인함수 종료
쓰레드01 1번째 실행중
쓰레드02 1번째 실행중
쓰레드01 2번째 실행중
쓰레드03 1번째 실행중
쓰레드01 3번째 실행중
쓰레드01 끝!
쓰레드04 1번째 실행중
쓰레드02 2번째 실행중
쓰레드03 2번째 실행중
쓰레드02 3번째 실행중
쓰레드02 끝!
쓰레드04 2번째 실행중
쓰레드03 3번째 실행중
쓰레드03 끝!
쓰레드04 3번째 실행중
쓰레드04 끝!
반응형
'JAVA > 기본 문법' 카테고리의 다른 글
[JAVA] 화면 입력 받기 (Scanner) (0) | 2022.04.18 |
---|---|
[JAVA] 시간 관련 ( 시간측정, 현재날짜/시간, 날짜/시간 포맷, 타이머 ) (0) | 2022.04.14 |
[JAVA] 예외처리 (Exception Handling) (0) | 2022.04.14 |
[JAVA] Stack & Queue (0) | 2022.04.13 |
[JAVA] 컬렉션 프레임워크 - 3. List (0) | 2022.04.13 |