재밌고 어려운 IT를 이해해보자~!
Section 18. 스레드 본문
01. 프로세스(process)와 스레드(thread)
두 가지 이상의 작업을 처리하는것을 '멀티태스킹(multi-tasking)'이라고 한다.
컴퓨터의 멀티태스킹을 위한 두가지 도구를 프로세스와 스레드 라고한다.
프로그램은 파일이 존재하지만 아직 메모리에 올라가 있지 않은 상태, 즉 실행되지 않은 코드의 집합을 말한다. 프로그램을 실행하는 순간 메모리에 올라가고 동작하게 되는데 이 상태의 프로그램을 프로세스 라고 한다.
프로그램과 프로세스는 일대다 매핑이 가능하다.
프로세스는 독립적으로 메모리에 등록되므로 여러 개의 프로그램을 동시에 실행할 수 있다.
프로세스 내부에 존재하면서 실행 흐름을 나타내는 것을 '스레드' 라고 한다.
프로세스들은 메모리에 독립적으로 등록되어 서로 간섭할 수 없다.
하나의 프로세스(프로그램) 안에서 다양한 작업을 동시에 하기 위해 스레드가 각자 독립적으로 존재하며 일을 수행한다.
하나의 프로세스는 적어도 한 개의 스레드를 지니게 된다.
더자세한 내용은....여기를 들려보세요!! 너무 잘 만들어놨어
출처: https://inpa.tistory.com/entry/👩💻-프로세스-⚔️-쓰레드-차이 [Inpa Dev 👨💻:티스토리]
02. 스레드의 사용
- Theard 클래스를 상속하여 run() 메서드을 Override로 구현
- Runnable 인터페이스 구현
Thread 클래스 상속
class MyThread extends Thread {
@Override
public void run() {
}
}
public class SumMain {
pulbic static void main(String{} args) {
myThread th = new MyThread();
th.start();
}
}
클래스를 실행시키기 위해선 start() 메서드를 호출해야 한다.
Runnable 인터페이스 상속
class whiteFlag implements Runnable {
@Override
public void run() {
while(true) {
...
}
}
}
public class RunnableMain {
pulbic static void main(String{} args) {
Thread write = new Thread(new whiteFlag());
write.start();
}
}
메인 클래스에서 스레드 선언 시 생성자 매개변수로 실행할 Runnable 클래스를 넘겨주어야 한다. 실제로 Runnable을 상속한 클래스는 Thread 클래스 내부에서 start() 메서드를 실행할 때 수행하게 된다.
익명 클래스를 람다식으로 표현
public class RunnableMain {
pulbic static void main(String{} args) {
//Runnable 인터페이스를 익명 객체로 처리
Runnable white = () -> {
while(true) {
...
}
};
Thread writeFlag = new Thread(white);
writeFlag.start();
}
}
Thread에 이름 부여하기
Theard가 가진 setter 메서드 setName(String name); 으로 이름을 지정할 수 있다.
public MyTask() {
setName("myTask-1");
}
Thread myThread = new Thread(task);
myThread.setName("Thread-blue");
Runnable 인터페이스를 상속한 경우에는 Thread를 선언한 후 이름을 부여할 수 있다.
멀티 스레드
같은 시간에 서로 다른 독립적인 스레드가 일을 처리하는 것을 우리는 비동기 작업이라고 한다.
03. 스레드 동기화
멀티 스레드 프로그램이 실행될 때 다수의 스레드가 하나의 데이터를 공유하면서 스레드 간의 경쟁이 일어날 수 있다. 이때 스레드 사이에 자원 소유의 순서가 잘못되어 예상치 못한 결과가 나타날 수 있따.
2개의 스레드가 1000씩 10번 더하는걸 실행해보면 최종적으로 20,000이 나와야 정상이지만 서로간에 작업을 간섭해서 20,000이 안나올 경우가 생긴다.
이러한 오류를 막기위해 스레드가 하나의 공유 데이터에 동시에 접근하지 못하도록 스레드의 실행을 제어하는데 이를 '스레드 동기화' 라고 부른다.
스레드 동기화 처리
멀티 스레드 프로그램에서 단 하나의 스레드만 처리할 수 있는 영역을 '임계 영역'이라고 한다.
동기화는 블록 또는 메서드 단위로 처리할 수 있는데 synchronized 키워드를 함께 사용한다.
메서드 동기화 처리
public synchronized void add() ...
메서드 전체를 동기화 하기 때문에 메서드 처리 시간이 길어질 경우 성능에 영향을 미치는 단점이 있다.
블록 동기화 처리
synchronized (객체명) ...
synchronized (현재 공유 중인 객체명)
@Override
public void run() {
synchronized (b) {
//run 기능구현
}
}
public static void main(String[] args) {
Bank b= new Bank();
Thread th1 = new Thread(new AddThread("1",b);
Thread th2 = new Thread(new AddThread("2",b);
th1.start();
th2.start();
}
04. 스레드 상태
sleep
주어진 시간동안 스레드를 정지시키는 메서드.
wait(), notify()
wait() : 스레드를 대기시키는 메서드
notify() : 대기중인 스레드를 다시 동작시키는 메서드
*참조
'JAVA Book Study' 카테고리의 다른 글
Section 19. 파일 입출력 (0) | 2024.01.17 |
---|---|
Section 17. 람다식 (0) | 2024.01.02 |
Section 16. 컬렉션 프레임워크 (1) | 2024.01.01 |
Section 15. 기본 API 클래스 (2) | 2024.01.01 |
Section 14. 예외 처리 (0) | 2023.12.31 |