본문 바로가기

Language/Java

Thread

1. 용어정리

(1) 프로그램이란?

특정 작업을 수행하기 위해 만들어진 기계. (가동 안하는 상태, 죽은 상태)

(2) 프로세서란?

작동하는 상태의 프로그램을 일컫는 말 (가동 중인 상태, 살아있는 상태)

(3) 쓰레드란?

프로세서를 작동시키고 있는 녀석으로, 특정 작업을 수행중 (기계를 돌리고 있는 인부)

(4) 프로세스란?

프로그램이 들어와 작업을 처리하는 공간. 

보통 설정 안하면, 하나의 프로세스에 하나의 쓰레드만 존재한다. 

프로세스에 여러 개의 쓰레드를 돌려서 프로그램들이 병렬 처리 되도록 할 수 있다. 

(하지만 이게 진짜로 일이 동시에 진행되는 것이 아니라, 두 가지 일이 순차적으로 처리되고 있지만, 그 둘이 스위칭 하는 게 나노미터 초로 이루어져서, 사람들 눈에는 그게 병렬 처리 하는 것처럼 보이는 것이다.)

2. 코드 리뷰

(1) 쓰레드 혼자 일 처리

public class _01_Thread {
    public static void main(String[] args) {
    
            cleanBySelf();
    }


public static void cleanBySelf() {
    System.out.println("--혼자 청소 시작--");
    for (int i = 1; i <= 10; i+=2) {
        System.out.println("(혼자) " + i + "번방 청소 중");
    }
    System.out.println("-- 혼자 청소 끝--");
}
// (혼자) 1번방 청소 중
// (혼자) 2번방 청소 중
// (혼자) 3번방 청소 중
// (혼자) 4번방 청소 중
// (혼자) 5번방 청소 중
// (혼자) 6번방 청소 중
// (혼자) 7번방 청소 중
// (혼자) 8번방 청소 중
// (혼자) 9번방 청소 중
// (혼자) 10번방 청소 중
// -- 청소 끝--

혼자 청소하기 싫다. 직원을 고용해서 동시에 청소 빨리 끝내고 싶다.

(2) 이게 병렬 처리..?

// 1. 쓰레드 생성
// 2. 쓰레드의 병렬처리 기능을 활용하려면, 클래스가 Thread를 상속하고 있어야 한다.

public class CleanThread extends Thread {
    public void run() {
        System.out.println("--직원 청소 시작(Thread)--");
        for (int i = 2; i <= 10; i+=2) {
            System.out.println("(직원) (Thread) " + i + "번방 청소 중");
        }
        System.out.println("--직원 청소 끝(Thread)--");
    }
}
public class _01_Thread {
    public static void main(String[] args) {

        CleanThread cleanThread = new CleanThread();
        // 직원 청소 -> 근데 이건 그냥 순차 수행이지, Thread 를 쓰는 본질적 이유인 병렬처리를 하지 못함.
        cleanThread.run(); 
        cleanByBoss(); // 사장님이 청소하는 것

    }

    public static void cleanByBoss() {
        System.out.println("--사장 청소 시작--");
        for (int i = 1; i <= 10; i+=2) {
            System.out.println("(사장) " + i + "번방 청소 중");
        }
        System.out.println("-- 사장 청소 끝--");
    }
}

순차 수행이지, 동시 수행이 아니다.

(3) 진짜 병렬  처리

public class _01_Thread {
    public static void main(String[] args) {



        CleanThread cleanThread = new CleanThread();
        //부모 클래스인 Thread의 매소드인 start 쓰면 병렬처리가 가동됨.
        cleanThread.start();
        cleanByBoss(); // 사장님이 청소하는 것

    }

    public static void cleanByBoss() {
        System.out.println("--사장 청소 시작--");
        for (int i = 1; i <= 10; i+=2) {
            System.out.println("(사장) " + i + "번방 청소 중");
        }
        System.out.println("-- 사장 청소 끝--");
    }
}

번갈아 수행되는 모습.

3. 스스로 해보기

//Thread 상속한 클래스 

public class Goal extends Thread {
    public void run(){
        for (int i = 0; i < 10; i++) {
            System.out.println((i+1)+"번째 골!!!!");
        }
        System.out.println("경기 끝.");
    }
}
package WorkOut_Myself;

import WorkOut_Myself.Goal.Goal;

public class Thread_myself {
    public static void main(String[] args) {

        Goal G = new Goal();
        G.start();
        shoot();

    }
    public static void shoot () {
        for (int i = 0; i < 10; i++) {
            System.out.println((i+1)+"번 째 슛!!!!");
        }
        System.out.println("-------------경기 끝!------------");
    }
}

** 스스로 하면서 알아낸 것**

(1)Thread를 상속한 클래스에서 병렬 처리 하고 싶은 매소드는 이름이 run이어야 한다. 

    그래야지 객체.start(); 했을 때 해당 매소드가 자동 호출되고 병렬로 일을 한다.

 

(2)병렬 처리하고 싶은 매소드가 Thread객체.start(); 밑에 있어야 한다.

     만약 병렬처리하고 싶은 녀석이 Thread객체.start(); 위에 있으면 병렬처리가 안된다.

Goal G = new Goal();
shoot();
G.start();

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

몰랐던 것  (0) 2023.05.21
Runnable  (0) 2023.03.11
Throws (예외 처리 미루기)  (0) 2023.03.02
사용자 정의 예외  (0) 2023.03.02
Try with Resources  (0) 2023.02.28