본문 바로가기

Java/Java

(JAVA) 쓰레드의 개요 (1)

프로세스와 Thread

프로세스는 실행 중인 프로그램이고 OS로부터 실행에 필요한 자원을 할당받아 프로세스가 실행된다.

 

프로세스의 자원을 이용해서 실제로 작업을 수행하는 대상이 Thread이다.

 

모든 프로세스에는 하나이상의 Thread가 존재하며

두 개 이상의 스레드가 존재하는 프로세스를 멀티스레드 프로세스라고 한다.

 

 

대부분의 OS는 멀티태스킹 (다중 작업)을 지원하기 때문에 여러 개의 프로세스가 동시에 실행되는 것이 가능하다.

  • CPU의 코어는 한 번에 단 하나의 작업만을 수행

https://movefast.tistory.com/43

 

CPU, Core, Thread - 중앙 처리 장치, 코어와 쓰레드

▶ CPU의 성능, 코어 - 코어 : CPU에 내장된 처리회로의 핵심 부분으로, 과거에는 CPU당 1코어(단일 코어)인 것이 당연했으나 요즘은 CPU마다 2개 이상의 코어를 집어넣은 멀티 코어가 등장하여 클럭의 수가 아닌..

movefast.tistory.com


멀 티쓰레딩의 장점

  • CPU의 사용률을 향상한다.
  • 자원을 보다 효율적으로 사용 가능하다.
  • 사용자에 대한 응답성이 향상된다.
  • 작업이 분리되어 코드가 간결해진다.

멀 티쓰레딩의 단점

여러 스레드가 같은 프로세스 내에서 자원을 공유하면 작업하기 때문에 

동기화, 교착상태와 같은 문제를 고려해서 신중히 프로그래밍해야 한다.


Thread의 구현과 실행

  • Thread 클래스 상속

  • Runnable 인터페이스 구현

Thread클래스를 상속받는 방법은 상속은 1개의 클래스만 가능하기 때문에 다른 클래스를 상속받을 수 없다는 단점이 존재한다.

Runnable 인터페이스를 구현하는 방법이 재사용성과 코드의 일관성 측면에서 좀 더 객체지향 적인 방법이다.

 

Thread를 상속

class ThreadEx1_1 extends Thread{
    @Override
    public void run() {
        for (int i=0;i<5;i++){
            System.out.println(getName());
        }
    }
}

Runnable을 구현

class ThreadEx1_2 implements Runnable{
    @Override
    public void run() {
        for (int i=0;i<5;i++){
            System.out.println(Thread.currentThread().getName());
        }
    }
}

실행

 

public class ThreadEx {

    public static void main(String[] args) {
        ThreadEx1_1 th1 = new ThreadEx1_1();
        th1.start();

        Runnable r = new ThreadEx1_1();
        Thread th2 = new Thread(r);
        th2.start();
    }
}

실행결과

Thread를 상속받는 것과 Runnable을 구현하는 것과 인스턴스 생성에 있어서 차이가 있다.

 

 

 

 

Thread 클래스중 Runnable 인터페이스를 파라미터로 받는 생성자에 만든 파라미터를 전달해야 한다.

Runnable은 인터페이스 이기에 start()라는 구현체가 없기 때문이다.


Thread의 실행 - start()

Thread는 생성하였다고 해서 자동으로 실행되지 않는다. 

start()를 호출해야지 해당 스레드가 실행된다.

 

또 이때 start()를 호출하였다고 해서 바로 실행되는 것이 아니라 일단 실행 대기 상태에 있다가 OS의 스케쥴러가 작성한 스케줄에 의해 결정된 순서에 따라서 자신의 차례가 도착하면 그때서야 실행한다.

 

Thread 두 번 호출

Runnable r = new ThreadEx1_1();
Thread th2 = new Thread(r);
th2.start();
th2.start();

위와 같이 같은 Thread를 두번 연속으로 호출하면 어떻게 될까?

실행결과

오류가 떨어지는 이유는 새로운 Thread를 생성하지 않고 기존의 Thread를 재호출하였기 때문이다.

재호출 하려면 Thread를 다시 한번 생성해야 한다.

 


코드 참조

https://github.com/mike6321/PURE_JAVA/tree/master/Thread

 

mike6321/PURE_JAVA

Contribute to mike6321/PURE_JAVA development by creating an account on GitHub.

github.com

'Java > Java' 카테고리의 다른 글

(JAVA) 싱글쓰레드와 멀티쓰레드  (0) 2020.01.20
(JAVA) 쓰레드의 개요(2)  (0) 2020.01.19
(JAVA) 애노테이션 프로세서  (0) 2019.12.28
(JAVA) 클래스의 프록시 생성  (0) 2019.12.24
(JAVA) 다이나믹 프록시  (0) 2019.12.24