● 프로그램
- 소스코드로 잘 짜여진 틀
- 실행이 안 된 상태
● 프로세스
- 실행된 프로그램
- 운영체제로부터 시스템 자원을 할당받는 작업의 단위
- JAVA는 운영체제가 바로 실행시켜주지 않고 JVM에 의해 실행되기 때문에 JVM으로부터 시스템 자원을 할당받는다.
● 쓰레드
- 프로세스의 처리 경로
- 멀티 쓰레드를 구현할 때에는 스케줄링 작업이 필요하다.
1. 단일 쓰레드
- 처리 경로를 한 개만 가지고 있기 때문에 직렬적이다.
- 동시에 많은 양을 처리하기 힘들기 때문에 상대적으로 비효율적이다.
- 하지만 하나의 작업에 문제가 발생하더라도 다른 작업에는 영향을 끼치지 않는다.
- 따라서 안정성이 보장되고 설계 시 멀티 쓰레드에 비해 쉽다.
2. 멀티 쓰레드
- 하나의 프로세스를 동시에 처리하는 것처럼 보이지만 사실은 매우 짧은 단위로 분할해서 차례로 처리한다.
- 여러 개의 처리 경로를 가질 수 있도록 하며, 동시 작업이 가능해진다.
- 설계하기 굉장히 어려우며, 하나의 쓰레드 문제 발생 시 모든 쓰레드에 문제가 발생하게 된다.
- JAVA 웹 서버가 대표적인 멀티 쓰레드이다.
- 멀티 쓰레드로 설계했다면 처리량 증가, 효율성 증가, 처리비용 감소의 장점이 있기 때문에 단점을 감수하고 설계하는 편이다.
● 멀티 쓰레드의 최대 단점 : 교착 상태(Deadlock)
- 멀티 쓰레드 중 쓰레드 간에 대기 상태가 종료되지 않아서 무한정 대기만 하는 비정상적인 상태
- 교착상태인 지를 판단했다면 전체 쓰레드를 깨워주거나, 하나의 쓰레드를 종료시켜주면 교착상태가 해결된다.
● 멀티 쓰레드 구현 방법
** 핵심 : run() 메소드 재정의, 구현
1. Thread 클래스 상속
2. Runnable 인터페이스 지정
실습(Thread(1))
1. Thread 클래스를 상속받는 Thread1.java 생성
public class Thread1 extends Thread{
String data;
public Thread1() {;}
public Thread1(String data) {
super();
this.data = data;
}
@Override
public void run() { // 자원
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {;}
System.out.println(data);
}
}
}
2. ThreadTest.java에서 실행
public class ThreadTest {
public static void main(String[] args) {
Thread1 t1 = new Thread1("★");
Thread1 t2 = new Thread1("♥");
// 멀티 쓰레드는 무조건 start() 메소드를 사용한다.
// start() : Thread 클래스에 선언된 메소드
t1.start();
t2.start();
}
}
![](https://blog.kakaocdn.net/dn/GTyF5/btrwA6WY8Ev/L9V530UP1en9LufHLkzSx0/img.png)
실습(Thread(2))
1. Runnable 인터페이스를 구현한 Thread2.java 생성
public class Thread2 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
// 객체화할 때 등록할 이름
System.out.println(Thread.currentThread().getName());
try {Thread.sleep(500);} catch (InterruptedException e) {;}
}
}
}
2. ThreadTest.java에서 실행
public class ThreadTest {
public static void main(String[] args) {
// Runnable t1 = new Thread2();
// Thread2 t2 = new Thread2();
// Thread thread1 = new Thread(t1, "!");
// Thread thread2 = new Thread(t2, "?");
// start() 메소드를 사용하기 위해 Thread 객체를 생성해야 한다.
Thread thread1 = new Thread(()->{
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName());
try {Thread.sleep(500);} catch (InterruptedException e) {;}
}
}, "!") ;
Thread thread2 = new Thread(()->{
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName());
try {Thread.sleep(500);} catch (InterruptedException e) {;}
}
}, "?");
// join() : 사용한 쓰레드가 다 끝나야 다른 쓰레드가 동작한다.
// 먼저 실행할 곳에 join()을 사용한다.
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main 쓰레드 종료");
}
}
![](https://blog.kakaocdn.net/dn/VQBET/btrwtAwzPt3/K7unoF6xakA1Le7B5OO9C0/img.png)
'웹 개발 > Java' 카테고리의 다른 글
[Web_JAVA] 39 (0) | 2022.03.25 |
---|---|
[Web_JAVA] 38 (0) | 2022.03.24 |
[Web_JAVA] 36 (0) | 2022.03.22 |
[Web_JAVA] 35 (0) | 2022.03.21 |
[Web_JAVA] 34 (0) | 2022.03.20 |