본문 바로가기

공부방/Java

멀티 스레드(Thread) 구현하기

스레드(Thread) 란, 프로그램의 흐름을 말하는 것으로,
프로그램을 실행하면 main() 메서드가 호출되어 하나의 흐름(메인 스레드)이 시작되는데,
일반적으로 흐름이 하나밖에 없는 프로그램을 싱글 스레드라고 하며,
이제부터 구현해볼 흐름이 여러개인 프로그램은 멀티 스레드라고 한다.
즉, 동시에 여러개의 흐름이 동작하는 것이다.

<Thread 클래스>
자바에서는 멀티 스레드를 수행하기 위해서 Thread 클래스를 이용하여 새로운 스레드를 생성한다.
스레드를 만들기 위해서는 우선 Thread 클래스를 상속받는 클래스를 작성하고,
run() 메서드를 오버라이딩 한다. 그리고, 그 안에 처리할 내용을 기술한다.

즉, start() 메서드와 run() 메서드는 이미 규정 되어있는 메서드이며,
run() 메서드의 내용을 오버라이딩 하여 실행할 처리문을 넣는 것이다.


class HelloThread extends Thread{  //Thread 클래스를 상속받는 클래스를 작성

 public void run(){   //run() 메서드를 오버라이딩
    처리부분;
  }
}

 
스레드의 작성과 실행은 다음과 같이 한다.

HelloThread h = new HelloThread();
h.start();

 
 그러면, 멀티스레드로 동작하는 예제를 구현하기 위해,

시계의 똑딱(틱택) 을 0.5 초 간격으로 동시에 작동하는 멀티 스레드를 구현해보자.

책에서는 안의 내용의 순서가 좀 다르고, 이름이 다르긴 한데, 내가 작성해본 새로운 이름으로 구현해보았다.

<a.java 소스내용>

 

//public class a
class a extends Thread{
  public static void main(String [] args){
    a tick = new a("tick", 1000, 5);
    a tack = new a("/tack", 1000, 5);
    
    tick.start();  //Thread 클래스의 start() 메서드를 이용해 스레드를 실행
    try{
      Thread.sleep(500);  //Thread 클래스의 sleep() 메서드를 이용해 시간지연(단위는 밀리초로 1초는 1000 이다.)
    }catch(Exception e){}
    tack.start();
  }
  private String word;
  private int Time;
  private int count;
  
  public a(String w, int t, int c){
    word = w;
    Time = t;
    count = c;
  }
  
  public void run(){   //Thread 클래스의 run() 메서드를 오버라이딩
    for(int i=0;i

책에서는 public main() 부분이 코드 하단부에 있는데,
아무래도 main() 부분이 하단에 있으면 헷갈릴것 같아서 위로 옮겼다.(위치 상관없음)

그리고, 책에서는 Thread 클래스를 상속받은 클래스명을 WordThread 로 명명하였으나,
나는 지금까지 코딩해온 관례대로 그냥 a 라는 이름으로 명명했다.

지금까지 해온 일반적인 코딩은

public class a{

로 시작했지만,
이 예제는 Thread 클래스를 상속받는 클래스이므로, 아래와 같이 클래스명을 지정한다.

class a extends Thread{

이렇게 지정하고, 내용을 넣는데,
예제를 테스트 하다가 실수로, 코딩을 잘못했는데, 약간의 차이가 있었다.

아래는 잘못 코딩하여 두개의 클래스를 가진 a.java 코딩을 한 경우의 소스이다.


public class a
{
  public static void main(String [] args){
    WordThread tick = new WordThread("tick", 1000, 5);
    WordThread tack = new WordThread("/tack", 1000, 5);
    
    tick.start();
    try{
      Thread.sleep(500);
    }catch(Exception e){}
    tack.start();
  }
}
class WordThread extends Thread{
  private String word;
  private int Time;
  private int count;
  
  public WordThread(String w, int t, int c){
    word = w;
    Time = t;
    count = c;
  }
  
  public void run(){
    for(int i=0;i

이렇게 실수로 코딩을 잘못해서 클래스를 두개가진 소스를 코딩했는데,
에러없이 컴파일이 되는게다...
차이점은, 이렇게 코딩을 하니, 별도로 WordThread.class 파일이 하나 더 컴파일 되었더라는 것이다.
즉, 위와같이 코딩한후 a.java 를 컴파일 하면, a.class 파일과 WordThread.class 파일 두개가 생겨난다.
그리고, a.class 를 실행하면 문제없이 동작하고,
더욱 재미있는 점은 그렇게 만들어진 WordThread.class 가 없어도 a.class 만으로도 잘 생행이 된다는 것이다.


테스트해본 결과, 실제 시간과 달리 약간 빠른 느낌이 든다.
즉, 틱택을 합해 1초여야 하지만, 실제 초시계보다는 약간 빨리 가는 느낌이 든다.