1111 | 자바의 정석 기초편 :: ch13-1~13-6
프로세스와 쓰레드(PROCESS & THREAD)
✔ 프로세스
: 실행중인 프로그램, 자원(RESOURCES 메모리, CPU)와 쓰레드로 구성
✔ 쓰레드
: 프로세스 내에서 실제 작업을 수행.
: 모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다.
: 프로세스가 공장이라면 쓰레드는 일꾼
* 멀티쓰레드로 작성하면 일꾼이 여럿이라 나눠서 일을 수행하고 효율적 처리가 가능해진다.
** 하나의 새로운 프로세스를 생성하는 것보다 하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 든다.
- 2프로세스 각 1쓰레드*2 <<<< 1프로세스 2쓰레드
멀티쓰레드의 장단점
✔ 장점 : 자원을 보다 효율적으로 사용 가능 : 사용자에 대한 응답성(REPONSENESS)이 향상 : 작업이 분리되어 코드가 간결해짐 👉 여러모로 이점이 있음 |
✔ 단점 (자원의 공유로 인한 문제점) : 동기화 (SYNCHRONIZATION)에 주의 : 교착상태 (DEAD-LOCK)가 발생하지 않도록 주의 : 각 쓰레드가 효율적으로 고르게 실행될 수 있도록 함 (기아: 특정 쓰레드가 작업할 기회를 갖지 못해서 진행이 안될수 있음 👉 프로그래밍시 고려해야 할 사항이 많아짐 |
스레드의 구현과 실행 - 둘다 목적은 run()을 완성하여 스레드가 수행할 작업을 제공하는것.
① Thread 클래스 상속
: 자바는 단일상속만 허용하므로 다른 클래스 상속이 어려움
② Runnable 인터페이스 구현 (이쪽이 더 나음)
class MyThread extends Thread{
public void run() { // 1. Thread클래스의 run()을 오버라이딩
/*작업내용*/}
MyThread t1 = new MyThread(); // 쓰레드의 생성
t1.start(); // 쓰레드의 실행
---------------------------------------------------------
public interface Runnable{ // Runnable 인터페이스가 추상메서드 run()을 지님
public abstract run();}
class MyThread2 implements Runnable{ // 2. Runnable 인스턴스구현
public void run() { // Runnable 인터페이스의 추상메서드 run()을 구현
/*run메서드 완성*/}
Runnable r = new MyThread2();
Thread t2 = new Thread(r); // Thread(Runnable r)
// Thread t2 = new Thread (new MyThread()); 위의 두줄을 한줄로
// run이란 메서드의 구현체를 외부에서 제공받음 . sort(Comparator c와 유사)
t2.start();
// t1과 t2쓰레드 두개를 생성
* 메인메서드에 싱글 쓰레드를 돌리면 t1다음에 t2가 작동되어 절대 섞이지 않지만 멀티쓰레드로돌리면 스레드값이 섞이는걸 알 수 있다 ( =각자 돌아가므로 불규칙하게 번갈아 실행)
쓰레드의 실행 - start()
: 쓰레드를 생성한 후에 start()를 호출해야 실행됨
ThreadEx t1 = new ThreadEx(); // 쓰레드 t1 생성
ThreadEx t2 = new ThreadEx(); // 쓰레드 t2 생성
t1.start();
t2.start(); // 즉시 실행되는게 아니라 os의 스케줄러가 실행 순서를 결정함. 먼저 시작했다고 먼저 실행되는게 아님.
👉 쓰레드가 os(스케줄러)에 의존적인 면을 가지고 있음.
virtual machine이 독립적이지만 몇가지가 종속적임.
start() 와 run()
: 우리가 run()을 작성했는데 start()로 실행하는 이유
👉 start() 실행시 start가 새로운 호출스택을 생성하여 run을 올림 = 서로 독립적인 작업 수행
👉 만약 run()을 호출하면 하나의 스레드가 일을 하는것과 같음