[자바의 정석] 13. 쓰레드 - 쓰레드 개요, 구현과 실행

jyleever·2022년 10월 16일
0

자바의 정석

목록 보기
3/12
post-thumbnail

13-1. 프로세스와 쓰레드

프로세스 : 실행 중인 프로그램, 자원(메모리,cpu)과 쓰레드로 구성
쓰레드 : 프로세스 내에서 실제 작업을 수행
모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다.

프로세스 : 쓰레드 = 공장 : 일꾼

싱글 쓰레드 프로세스
= 자원 + 쓰레드

멀티 쓰레드 프로세스
= 자원 + 쓰레드 + 쓰레드 + 쓰레드 ... + 쓰레드

  • pid : 프로세스 ID

"하나의 새로운 프로세스를 생성하는 것보다 하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 든다"

13-2. 멀티쓰레드의 장단점

대부분의 프로그램이 멀티쓰레드로 작성되어 있따. 그러나, 멀티쓰레드 프로그래밍이 장점만 있는 것은 아니다.

장점

  • 시스템 자원을 보다 효율적으로 사용할 수 있다
  • 사용자에 대한 응답성(responseness)이 향상된다
  • 작업이 분리되어 코드가 간결해진다
    "여러모로 좋다"

단점

  • 동기화(synchronization)에 주의해야 한다.
    쓰레드가 여러 자원을 동시에 사용할 때 ..
  • 교착상태(dead-lock)가 발생하지 않도록 주의해야 한다
    서로 필요한 자원을 상대방이 가지고 있을 때...
    기아 상태 발생 문제 - 쓰레드가 실행할 기회를 갖지 못 해 작업이 진행되지 않는 것
  • 각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야 한다
    "프로그래밍할 때 고려해야 할 사항들이 많다"

13-3. 쓰레드의 구현과 실행

  1. Thread 클래스를 상속
    • 자바는 단일 상속이기 때문에 다른 클래스를 상속받기 어려워짐
    class MyThread extends Thread{
    	public void run(); { // Thread 클래스의 run()을 오버라이딩
        /* 작업 내용 */
        }
    }
    MyThread1 t1 =  new MyThread(); // 쓰레드 생성
    t1.start(); // 쓰레드의 실행
  2. Runnable 인터페이스를 구현 - better
    • 다른 클래스를 상속받을 수 있으므로 유연함
    class MyThread2 implements Runnable{
    	public void run(){ // Runnable 인터페이스의 추상메서드 run()을 구현
        /* 작업 내용 */
        }
    }
    Runnable r = new MyThread2();
    Thread t2 = new Thread(r); // 또는 Thread(Runnable r) run() 메서드의 구현체를 외부에서 매개변수로 받음, 외부에서 제공한 run을 쓰레드의 메소드로 호출
    // 또는 Thread t2 = new Thread(new MyThread2());
    t2.start();

run()? 쓰레드가 실행할 작업

Thread 클래스를 상속 받으면 this.getName()~ 이런 식으로 this 이용하여 조상인 Thread의 getName() 호출
Runnable 인터페이스를 구현하면 Thread.curretnThread()를 이용해 현재 실행 중인 쓰레드 정보 받아옴

별도의 쓰레드로 만들어서 각자 작업을 수행하면 작업 순서가 섞임

13-5 쓰레드의 실행 - start()

쓰레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작한다.

  • 쓰레드를 start() 하면 실행 가능한 상태가 될 뿐, 실행 되는 것은 아니다. OS 스케줄러가 실행 순서를 결정해준다.
ThreadEx1_1 t1 = new ThreadEx1_1(); // 쓰레드 t1을 생성한다
ThreadEx1_2 t2 = new ThreadEx1_2(); // 쓰레드 t2를 생성한다

t1.start(); // 쓰레드 t1을 실행시킨다
t2.start(); // 쓰레드 t2를 실행시킨다		

13-6 start() 와 run()

class ThreadTest{
	public static void main(String args[]){
    	MyThread t1 = new MyThread(); // 쓰레드 생성
        t1.start(); // 실행
    }
}
class MyThread extends Thread{
	public void run(){
    	...
    }
}

반드시 start()를 호출해야 새로운 호출 스택이 생성되고 서로 독립적으로 작업 수행
즉 run()이 아니라 start()를 호출해서 새로운 쓰레드 시작

0개의 댓글