본문 바로가기

라이브러리 활용 - 멀티 스레드

스레드 상태

스레드 상태

  • 실행 대기 상태: 실행을 기다리고 있는 상태
  • 실행 상태: CPU 스케쥴링에 따라 CPU를 점유하고 run() 메소드를 실행. 스케줄링에 의해 다시 실행 대기 상태로 돌아갔다가 다른 스레드가 실행 상태 반복
  • 종료 상태: 실행 상태에서 run() 메소드가 종료되어 실행할 코드 없이 스레드의 실행을 멈춘 상태


    출처, 이것이 자바다


일지 정지 상태

  • 스레드가 실행할 수 없는 상태
  • 스레드가 다시 실행 상태로 가기 위해서는 일시 정지 상태에서 실행 대기 상태로 가야야 함


    출처, 이것이 자바다


주어진 시간 동안 일시 정지

  • Thread 클래스의 sleep() 메소드: 실행 중인 스레드를 일정 시간 멈추게 함
  • 매개값 단위는 밀리세컨드(1/1000)


    출처, 이것이 자바다


package ch14.sec05.exam01;

/*
 스레드 상태 : 일시정지
 */

import java.awt.Toolkit;

public class SleepExample {

    //메인 스레드 : 10번 3초마다 일시정지.
    public static void main(String[] args) {
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        for(int i=0; i<10; i++) {
            toolkit.beep(); 
            System.out.println("띵");
                  //3초마다 일시정지
            try { Thread.sleep(3000); } catch (Exception e) {}
        }               
    }
}

다른 스레드의 종료를 기다림

  • 스레드는 다른 스레드와 독립적으로 실행하지만 다른 스레드가 종료될 때까지 기다렸다가 실행을 해야 하는 경우가 있다.
  • 예) 계산 스레드의 작업이 종료된 후 그 결과값을 받아 처리하는 경우

package ch14.sec05.exam02;

//스레드 클래스를 상속하여, 자식 클래스로 스레드 작업
public class SumThread extends Thread {
    private long sum;

    public long getSum() {
        return sum;
    }

    //1 ~ 100 까지의 합
    @Override
    public void run() {
        for(int i=1; i<=100; i++) {
            sum += i;
        }
    }
}

package ch14.sec05.exam02;

/*
 스레드 : 일시정지(join) 다른 스레드의 종료를 기다렸다가 진행을 하고자 할때 사용. 
  -메인 스레드, 작업자 스레드
 */

public class JoinExample {

    public static void main(String[] args) {

        SumThread sumThread = new SumThread(); //스레드상태 : New
        sumThread.start(); //스레드상태 : Runnable(실행대기)

        try {
            //메인스레드는 일시정지가되고, sumThread 스레드가 종료될 때 메인 스레드는 실행대기상태가 된다.
            sumThread.join(); //sumThread 스레드의 종료를 기다리는 목적.(sumThread 스레드의 작업결과를 사용)
        } catch (InterruptedException e) {}    
        System.out.println("1 ~ 100 합: " + sumThread.getSum());
    }
}

다른 스레드에게 실행 양보

  • yield() 메소드: 실행되는 스레드는 실행 대기 상태로 돌아가고, 다른 스레드가 실행되도록 양보
  • 무의미한 반복을 막아 프로그램 성능 향상


    출처, 이것이 자바다



    출처, 이것이 자바다


package ch14.sec05.exam03;

/*
 스레드 상태 : 일시정지(yield)
 CPU의 점유를 받은 스레드가 할 일이 없는 상황이 발생되었을 때
 즉, CPU의 자원이 낭비가 되는 상황을 막고, 실행대기상태의 다른 스레드에게 기회를 주고자 한다.
 */

public class WorkThread extends Thread {

    //필드
    public boolean work = true;

    //생성자
    public WorkThread(String name) {
        setName(name); //스레드 이름변경.
    }

    //메소드
    @Override
    public void run() {
        //main스레드와는 별개로 독립적으로 실행되는 코드
        while(true) {
            if(work) {
                //실제작업
                System.out.println(getName() + ": 작업처리");
            }else {
                Thread.yield(); //현재 실행중인 스레드는 일시정지가 된다.
            }
        }
    }
}

package ch14.sec05.exam03;

/*
 스레드 : 메인 스레드, workThreadA스레드,workThreadB스레드
 실행(스레드) : cpu가 일정 할당된 시간만큼만 run()메소드의 코드를 실행한다.
 스레드를 runnable(실행대기) 상태로 돌려보낸다.
 */

public class YieldExample {

    public static void main(String[] args) {
        WorkThread workThreadA = new WorkThread("WorkThreadA");
        WorkThread workThreadB = new WorkThread("WorkThreadB");

        workThreadA.start(); //Runnable 상태
        workThreadB.start();

        //메인 스레드 5초 일시정지.
        try { Thread.sleep(5000); } catch (InterruptedException e) {}
        workThreadA.work = false;

        //메인 스레드 10초 일시정지.
        try { Thread.sleep(10000); } catch (InterruptedException e) {}
        workThreadA.work = true;
    }
}

'라이브러리 활용 - 멀티 스레드' 카테고리의 다른 글

스레드 안전 종료  (1) 2023.02.06
스레드 동기화  (0) 2023.02.03
스레드 이름  (0) 2023.02.03
작업 스레드 생성과 실행  (1) 2023.02.03
메인 스레드  (0) 2023.02.03