본문 바로가기

Java

자바/JAVA/Thread/스레드

스레드(Thread)란?

   스레드란 CPU가 독립적으로 처리할 수 있는 하나의 작업 단위를 말한다. 자바에서는 스레드Thread를 사용하면, 한 번에 하나의 작업이 아닌 한 번에 여러 개의 작업을 동시에 처리할 수 있다. 때문에 스레드Thread를 사용하면 그만큼 작업시간을 절약할 수 있다. 작업을 하나씩 하나씩 순서대로 처리하는 방식을 싱글 스레드라고 하며, 이와 달리 여러 작업을 동시에 진행하는 방식을 멀티 스레드라고 한다. 스레드를 사용하는 여러 방법들 중 하나는 스레드 클래스를 상속받아서 사용하는 것이다. 아래 게임과 BGM 예시 코드를 통해 이를 더 자세히 알아보자. 게임과 BGM은 함께 동시에 작업을 진행하다가 끄는 그 순간에 함께 작업이 종료되어야 한다. 

 

먼저 BGMPlay 클래스이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package kr.koreait.threadTest;
 
public class BGMPlay extends Thread{
 
    @Override
    public void run() {
 
        while (true) {
            System.out.println("배경 음악 재생 중......");
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }    
}
 
cs

 

   BGMPlay 클래스에서는, 스레드 클래스를 상속받아서 run()메소드를 오버라이드(Override) 하였다. 오버라이드 해야만 아래 GamePlay 클래스에서 start() 메소드를 통해 run()을 동작할 수 있다. 또한 Thread.sleep(500)을 통해 스레드를 잠시 멈추게 할 수도 있다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package kr.koreait.threadTest;
 
public class GamePlay {
 
    public static void main(String[] args) {
        
        BGMPlay bgm = new BGMPlay();
//        daemon 스레드는 다른 스레드가 모두 종료되면 같이 종료되는 스레드를 말한다.
        bgm.setDaemon(true);         // 데몬 스레드로 만든다.
        bgm.start();        
        
        for (int i = 0; i < 10; i++) {
            System.out.println("신나게 게임 중.....");
            if(i == 7) {
                System.out.println("앗...엄마다!!!");
                System.out.println("엄마가 오셔서 게임을 종료합니다...");
                break;
            }
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }        
    }    
}
 
cs

 

GamePlay 클래스에서 BGMPlay 클래스를 객체로 받는다. daemon 스레드는 메인 스레드(여기서는 GamePlay)가 종료되면 그 시점에 데몬 스레드(BGMPlay)도 같이 종료되게 만든다. 동영상이나 음악 재생 등에서 자주 사용된다. 때문에 bgm을 데몬 스레드로 만들면, 게임이 종료됨과 동시에 음악 재생도 함께 종료된다. 여기서는 이를 알아보기 쉽게 System.out.println 으로 출력해보았다. 아래 콘솔 화면을 확인해보자. 

 

 

 

콘솔창에서 볼 수 있듯이 배경음악 재생과 게임이 동시에 실행되는 것을 볼 수 있다. 그리고 게임을 종료하면 배경음악도 더이상 재생되지 않고 함께 종료된다. 이와 같은 동시 작업은 스레드를 이용하여 할 수 있다.