Java Thread 개념 및 예제

이동명·2023년 5월 31일
0
post-thumbnail

프로세스란

  • 프로세스는 실행중인 프로그램을 의미한다
  • 프로세스는 완전히 독립적인 수행단위이다

스레드란

  • 스레드는 프로그램 내에서 실행되는 프로그램 제어 흐름(실행단위)을 말한다
  • 한 프로그램에 여러개의 스레드가 존재할 수 있다. 스레드가 1개라면 - 단일스레드, 2개이상이라면 다중스레드
  • 프로그램 코드를 한 줄씩 실행하는 것이 스레드의 역할이다 (=실행제어)
  • 스레드란 곧 프로그램을 실행하는 주체이다
  • 스레드를 보통 가벼운 프로세스(light-process)라고 표현한다

멀티스레드란

  • 멀티스레드 =multi thread =다중스레드
  • 멀티스레드는 여러개의 스레드를 이용하는 프로그램이다
  • 다중 스레드에서 각각의 스레드는 하나의 독립적인 프로세스처럼 작업 수행

멀티 스레드로 구현된 프로그램을 실행하면

  • 하나의 프로세서는 한번에 스레드1개밖에 실행시키지 못한다
  • 대신 일정한 시간 간격으로 수행해야하는 스레드를 전환한다
  • 스레드를 전환할 때는 운영체제의 스케줄러의 기준에 따라 순서가 정해지게 된다
  • 여러 스레드를 번갈아 처리하기 때문에 엄밀히 말하면 한번에 한가지를 - 처리하지만 동시에 작업하는 듯한 효과를 준다
  • 이와 같은 방식을 시분할 방식 이라고 한다

멀티 스레드 방식을 사용하는 이유(feat. 멀티스레드의 장점)

  • 프로세스는 독립적이다. 이 때문에 작업공간이 독립적이고, 프로세스끼리 자원 및 데이터를 공유하기 어렵다. 혹시 프로세스간 데이터전송이 필요한 경우 시간, 자원 소요가 많다.
  • 프로그램 내의 스레드는 서로 독립적이지 않다. 작업공간을 같이 사용하기 때문에 자원 및 데이터를 공유할 수 있다. 즉 스레드간 데이터전송이 필요한 경우 시간, 자원 소요가 적다.
  • 정리하자면 스레드는 프로세스처럼 작업을 동시에 처리할 수 있는 공통적인 특징이 있으면서, 프로세스보다 오버헤드가 적다는 것이 장점이다.

스레드의 예제 풀어보기

스타크래프트 배럭을 예제로 삼아서 마린 생성을 쓰레드로 구현해보자.
메뉴 1번을 입력하게 되면 마린 클래스와 쓰레드를 상속받은 객체에서 쓰레드를 실행하고 현재 생성이 완료되었는지 아닌지를 판별하는 기능을 만들어보자.

marineExample.java

package MyThread;

import out.production.day6.MarineEnum;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class MarineExample {
    static List<Marien> list = new ArrayList<>();
    static int idx;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        while(true) {
            System.out.println("1. 마린 생성 하기");
            System.out.println("2. 마린 생성 내역 확인하기");
            System.out.println("3. 종료");
            System.out.print("입력 : ");

            int menu = sc.nextInt();


            switch (menu) {
                case 1:
                    System.out.println("마린을 생성 합니다 ...");
                    
					// ENUM 속성 사용해서 마린클래스 생성..
                    Marien m = new Marien(idx, MarineEnum.ING);
					
                    list.add(m);
					
                    // 쓰레드에 마린클래스를 같이 넣어서 생성
                    MarineThread mt = new MarineThread(m);

                    mt.start();	

                    idx++;

                    break;

                case 2:
                    for (int i = 0; i < list.size(); i++) {
                        System.out.println(list.get(i).idx + "번째 마린 : " + list.get(i).status);
                    }
                    break;

                case 3:
                    System.out.println("종료..");
                    return;

                default:
                    System.out.println("잘못된 메뉴를 선택 하셨습니다. 다시 선택 해 주세요.");
                    break;
            }
        }

    }

    public static class Marien {
        private int idx;
        private MarineEnum status;

        public Marien(int idx, MarineEnum status) {
            this.idx = idx;
            this.status = status;
        }

        public int getIdx() {
            return idx;
        }

        public void setIdx(int idx) {
            this.idx = idx;
        }

        public MarineEnum getStatus() {
            return status;
        }

        public void setStatus(MarineEnum status) {
            this.status = status;
        }
    }
}

MarineThread.java

import out.production.day6.MarineEnum;

public class MarineThread extends Thread {

    private MarineExample.Marien marien;

    public MarineThread(MarineExample.Marien marien) {
        this.marien = marien;
    }

    @Override
    public void run() {

        try {
            Thread.sleep(8000); // 8초 대기
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
		
        // 마린 클래스의 상태를 변경해주자..
        marien.setStatus(MarineEnum.END);

    }
}

연달아 마린 3번 생성

아직 해당 sleep이 지나지않아 update가 안된모습

sleep 이 지나는 과정과 전부 지나게 되며 status가 update된 모습을 확인 할 수 있다.

profile
Web Developer

0개의 댓글