The Debugging Chronicles : "코드의 미학"
Mentor JAVA - section18. 스레드 본문
프로세스와 스레드
- 동시에 두가지 이상의 작업을 처리하기 위한 도구들을 말한다.
프로그램 : 파일이 존재하지만 아직 메모리에 올라가 있지 않은 상내를 말한다. (실행되지 않은 코드의 집합)
프로세스 : 프로그램을 실행하는 순간 메모리에 올라가고 동작하게 되는 상태를 말한다. (프로그램의 한 단위)
프로세스는 독립적으로 메모리에 등록되므로 여러 개의 프로그램을 동시에 실행할 수 있게 된다.
하나의 프로세스는 적어도 한 개의 스레드를 지니게 된다.
스레드 : 프로세스 내부에 존재하면서 실행 흐름을 나타내느 것을 말한다. (프로그램 내에서 동작하는 작업 단위)
스레드의 사용
- 스레드를 생성하는 법
1. Thread 클래스를 상속하여 run() 메서드 구현
· 클래스를 실행시키기 위해선 start() 메서드를 호출해야 한다.
package section18;
class MyThread extends Thread {
@Override
public void run() {
int sum = 0;
for(int i = 0; i < 10; i++) {
sum = sum + (i+1);
}
System.out.println("sum = "+sum);
String threadName = Thread.currentThread().getName();
System.out.println("현재 스레드 이름 : "+threadName);
}
}
public class SumMain{
public static void main(String[] args) {
MyThread th = new MyThread();
th.start();
}
}
2. Runnable 인터페이스 구현
· Java는 다중 상속이 불가능하기 때문에 Runnable 인터페이스를 상속하여 구현한다.
· Thread 클래스를 선언하면서 Runnable을 상속한 클래스를 선언하여 매개변수로 넘겨준다.
(Thread 클래스가 스레드를 실행하는 주체이고 Runnable 인터페이스를 상혹한 클래스는 실행 코드를 지닌 객체기 때문이다.)\
Thread th = new Thread(Runnable을 상속한 인스턴스);
// 상속한 인스턴스는 Thread 자체를 상속한 것이 아니므로,
// 해당 객체를 인자로 넣어준다.
package section18;
// Runnable을 상속
class WhiteFlag implements Runnable{
@Override
public void run() {
while(true) {
System.out.println("백기 올려");
}
}
}
public class RunnableExample {
public static void main(String[] args) {
Thread write = new Thread(new WhiteFlag());
write.start();
}
}
- Thread에 이름 부여하기
· 현재 진행중인 스레드가 어떤 작업을 하는지 알기 위해서 이름을 부여한다.
· 생성한 스레드는 'Thread-n'이라는 이름으로 자동 설정되는데, 다른 이름으로 설정하고 싶다면 Thread 클래스의
setName() 메서드를 변경하면 된다.
- 멀티 스레드
· 여러 개의 스레드를 이용해 동시에 작업을 수행하는 것을 말한다.
· 같은 시간에서로 다른 독립적인 스레드가 일을 처리하는 것을 비동기 작업이라고 한다.
package section18;
public class RunnableExample {
public static void main(String[] args) {
// Runnable 인터페이스를 익명 객체로 처리
Runnable white = () -> {
for(int i = 0; i<5; i++) {
System.out.println("백기 올려");
}
};
Runnable blue = () -> {
for(int i = 0; i<5; i++) {
System.out.println("청기 올려");
}
};
Thread whiteFlag = new Thread(white);
Thread blueFlag = new Thread(blue);
whiteFlag.start();
blueFlag.start();
}
}
스레드 동기화
- 스레드 사이에서 자원 소유의 순서가 잘못되어 비정상적인 동작이 일어나는 것을 방지하기 위해 여러 스레드가 하나의 공유 데이터에 동시에
접근하지 못하도록 스레드의 실행을 제어하는 것을 '스레드 동기화'라고 한다.
- 스레드 동기화 처리
하나의 스레드가 임계 영역에 진입할 때 락을 걸어 다른 스레드가 수행되지 못하도록 하고 작업이 종료되면 락을 풀어서
다른 스레드가 작업하도록 하는 것을 '동기화' 처리라고 한다.
임계 영역 : 멀티 스레드 프로그램에서 단 하나의 스레드만 처리할 수 있는 영역
· 메서드 동기화 처리
메서드 이름 앞에 synchronized 키워드를 사용하면 해당 메서드 전체를 동기화 처리할 수 있다.
스레드의 순서는 자원을 점유한 스레드가 우선적으로 작업되므로 순서대로 동작되지는 않지만 서로 간섭하지 못했기 때문에 정상적으로
작동되는 것을 확인할 수 있다.
public synchronized void add() ...
스레드 상태
- 스레드는 생성하고 실행, 종료되기까지 다양한 상태를 가지며, 각 스레드의 상태는 스레드 클래스에 정의되어 Thread State 타입으로
알 수 있다.
- 생성, 대기, 일시정지, 종료 4가지로 구분되며, 상태 구분에 따른 값은 상수로 가지고 있는다.
'JAVA > Mentor JAVA' 카테고리의 다른 글
Mentor JAVA - section19. 파일 입출력 (0) | 2024.07.30 |
---|---|
Mentor JAVA - section17. 람다식 (0) | 2024.07.28 |
Mentor JAVA - section16. 컬렉션 프레임 워크 (0) | 2024.07.27 |
Mentor JAVA - section15. 기본 API 클래스 (0) | 2024.07.27 |
Mentor JAVA - section14. 예외 처리 (0) | 2024.07.25 |