🔥 Vamos/Java

1111 | 자바의 정석 기초편 :: ch13-1~13-6

unikue 2022. 11. 11. 12:21

프로세스와 쓰레드(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()을 호출하면 하나의 스레드가 일을 하는것과 같음