영보의 SystemOut.log

[Java] 자바 스레드(Thread)개념 / 스레드 스케줄링 / 예제 본문

국비교육(아이티센 입사교육)/Java

[Java] 자바 스레드(Thread)개념 / 스레드 스케줄링 / 예제

영보로그 2021. 10. 6. 10:03
반응형
자바/스프링 기반 디지털 융합 웹 개발자 양성과정 7일차

 

 

자바 스레드(Thread)

 - 하나의 프로그램이 동시에 여러 개의 일을 수행할 수 있도록 해주는 기법

 - 자바는 언어차원에서 스레드가 지원되기 때문에 안전성효율성이 보장됨

 - Multi-Threading이 지원되면

  → 하나의 프로그램내에서 여러 개의 일을 동시에 수행하는 것이 가능하고

  → 또 스레드간에 데이터 공유가 가능하므로 멀티프로세스 시스템보다 더 효율적으로 프로그램을 작성 가능하다.

 

 

 

스레드 우선 순위

 - 동시성과 병렬성

  # 동시성 : 멀티 작업 위해 하나의 코어에서 멀티 스레드가 번갈아 가며 실행하는 성질

  # 병렬성 : 멀티 작업을 위해 멀티 코어에서 개별 스레드를 동시에 실행하는 성질

 

 

 

스레드 스케줄링

 - 스레드의 개수가 코어의 수보다 많을 경우

 - 스레드를 어떤 순서로 동시성으로 실행할 것인가 결정 → 스레드 스케줄링

 - 스케줄링 의해 스레드들은 번갈아 가며 run() 메소드를 조금씩 실행

 

 

 

Multi-Threading 정리

 - 하나의 프로세스가 여러 가지의 일을 처리해야 할 때, 프로세스 내에 서 각 일을 처리하는 모듈들이 독립적으로 수행되는 것을 의미한다.

 - 이 각각의 실행하는 독립적인 모듈을 스레드라고 한다.

 - 즉, 스레드란 프로세스내에서 일을 처리하는 ‘세부 실행단위’를 의미함

 

 

 

자바의 스레드 지원 방식

(1) java.lang.Thread 클래스를 사용하는 방법

(2) java.lang.Runnable 인터페이스를 사용하는 방법

 

#차이점

(1) 방법 : 스레드를 지원하고자 하는 클래스를 생성시 즉 Thread를 상속받는 class를 start() 시킨다.

(2) 방법 : Runnable를 구현한 class를 new Thread()의 인수로 주어서 새로 만든 다른 클래스로부터 상속이 필요한 경우 Thread 객체를 start() 시키는것

 

 

 

Thread 클래스 사용법

(1) Thread 클래스를 상속받은 뒤, 해당 스레드에서 지원하고 싶은 코드를 run() 메서드에서 오버라이딩 해준다.

(2) 해당 스레드 객체를 생성한 후, 스레드 객체의 start() 메서드를 호출한다.

 

 

 

 멀티스레드 예제

 

 

 

# BeepPrintEx01.java

package 멀티스레드예제;

import java.awt.*;

/*
    싱글 스레드 (즉 메인 스레드) 애플리케이션

 */
public class BeepPrintEx01 {
    public static void main(String[] args) {
        // Toolkit 객체 얻어오기
        /*
            Toolkit 클래스는 '시스템 정보'를 얻는 것으로 시스템의 자원에 접근할 수 있는 클래스이다.
         */
        Toolkit toolkit = Toolkit.getDefaultToolkit();

        for ( int i = 0; i < 5; i++){
            toolkit.beep();
            try{
                Thread.sleep(1000); // 1초간 일시 정지
            }catch (Exception e){}
        }

        for(int i = 0; i < 5; i ++){{
            System.out.println("띵");
              try{
                 Thread.sleep(1000); // 1초간 일시 정지
             }catch (Exception e){}
            }
        }
    }
}

 

 

# BeepTask.java

package 멀티스레드예제;

import java.awt.*;

public class BeepTask implements Runnable{

    @Override
    public void run()  {
        Toolkit toolkit = Toolkit.getDefaultToolkit();

        for (int i = 0; i < 5; i++){
            toolkit.beep();
            try{
                Thread.sleep(1000); // 1초간 일시 정지
            }catch (Exception e){}
        }
    }
}

 

 

# BeepPrintEx02.java

package 멀티스레드예제;
/*
    메인 스레드
 */
public class BeepPrintEx02 {
    public static void main(String[] args) {
        // 작업 스레드 만드는 방법
        Runnable beepTask = new BeepTask();
        Thread thread = new Thread(beepTask);

        thread.start();     //  이 시점에서 작업 스레드와 메인 스레드가 동시에 실행

    }
}

 

 


# Thread  상속받아서 예제 - RobotRaceStart.java

package 가상의로봇릴레이게임;
import java.lang.*;

class RobotRace extends Thread{
    // 생성자
    public RobotRace(String name){
        super(name);
    }

    @Override
    public void run() {
        for(int i=1; i<=10; i++) {
            System.out.println(getName() + "가" + i*10 + "m전진");
            try {
                sleep(2000);    // 1초 일시 정지
            } catch (InterruptedException e) {
                System.out.println(e.toString());
            }
        }
    }
}
public class RobotRaceStart {
    public static void main(String[] args) {
        RobotRace robotA = new RobotRace("로봇-A");
        RobotRace robotB = new RobotRace("로봇-B");
        RobotRace robotC = new RobotRace("로봇-C");

        robotA.start();
        robotB.start();
        robotC.start();
    }
}

 

반응형