파파비의 블로그

Thread 쓰레드 본문

개발/java

Thread 쓰레드

N. Dave 2020. 4. 5. 09:50
반응형

쓰레드는 끈이라는 이야기이다.

 

코드가 존재하면 해당 코드는 쭉 처음부터 끝까지 실행된다. 하나의 끈처럼 말이다.

그런데 예를 들어 무한루프가 있다고 가정해보자. 해당 코드는 무한루프에 걸리면 계속 삥글삥글 돌 것이다.

더 이상 내려가지 않고 말이다.

 

만약 무한루프를 몇 개 따로 돌리면서 진행하는 프로그램을 만들고 싶다면 어떻게 해야할까?

쓰레드라는 개념을 알고 활용하면 된다.

 

쓰레드는 프로세스와 비슷하지만 다르다.

프로세스는 실행되면 하나의 일정 자원과 제어를 할 수 있게 되는데,

프로세스 끼리는 자원을 공유하지 않는다.

쓰레드는 프로세스 내에서 자원을 공유하면서 제어는 나눠서 하는 구조이다.

더 깊에 알고 싶으면 OS쪽을 공부하면 된다.

(나도 아직 공부중이라 깊게는 잘 모른다..)

 

아무튼 쓰레드에 대해서 더 이야기를 해보면 하나의 프로세스(프로그램) 안에서 다양하게 멀티로 진행되는 구조를 짜고 싶으면 쓰레드를 이용하라!

 

쓰레드를 구현하는 방법은 2가지가 있다.

 

1. Thread Class를 Extend(상속)하는 방법

  - 상속을 한 뒤에, run() 메소드를 구현

  - 그 뒤에 객체를 만들고 run()이 아닌 start() 메소드를 실행하면 쓰레드가 따로 시작한다.

 

2. Runnable 인터페이스를 구현

  - 어떤 클래스를 Runnable 인터페이스를 구현시킨다.

  - 이때 run()을 오버라이딩 해야한다.

 

  - 그리고 그 클래스의 객체를 만든다.

  - 해당 객체를 Thread 객체를 만들 때 인자로 넣어준다.

  - 그리고 start()를 돌리면 쓰레드가 시작된다.

 

둘 다 run메소드에는 새로운 thread가 하길 원하는 내용을 하면 된다.

 

특히 Thread.sleep(밀리세컨드 단위 파라미터);

이라는 static 메소드가 있다. 해당 thread가 잠깐 쉬는 것을 의미한다.

유니티에서는 코루틴과 비슷한 개념이다. 그런데 내가 알기론 유니티의 코루틴은 thread는 아니라고 한다.

 

참고로 main 메소드 역시 하나의 쓰레드이다.

 

이제 개념을 알았으니 코드로 구현을 직접해보자.

 

먼저

1. Thread를 상속한 class를 만들어 보자

class Thread1 extends Thread{

    public void run(){

             while(true){

                   try{

                          Thread.sleep(1000);

}

                   catch(Exception e){ }

                   System.out.println("1");

}

}

}

이렇게 Thread1 class를 구현했다.

여기서 튀어나온 try - catch 구문은 Thread.sleep 때문에 넣었다.

이제 객체를 만들어서 쓰레드를 실행시켜보자

 

Thread1 t1 = new Thread1();

t1.start();

매우 쉽다. 객체를 만들고 해당 객체를 start() 메소드를 실행시키면 된다.

 

 

2. Runnable 인터페이스를 구현

- 단일상속을 지원하는 자바에서 인터페이스로 쓰레드를 새로 만들 수 없다면

굉장히 한정적일 것이다.

 

Runnable인터페이스를 통한 방법을 다시 정리해보자면,

 

1. 새로운 클래스로 Runnable인터페이스 구현

2. 사용하려면 해당 클래스 객체를 만들어두고

3. Thread 객체도 만드는데, 이때 인자로 위 클래스 객체를 넣어준다.

 

코드로 한번 살펴보자

 

class Thread2 implements Runnable{

@Override
   public void run() {
       while(true) {
             try {
                      Thread.sleep(1000);
                  }
            catch(Exception e){}

 

            System.out.println("2");
        }
    }

}

이렇게 인터페이스를 구현했다.

쓰레드를 실행하면 1초마다 2를 출력할 것이다.

이제 쓰레드를 실행하는 코드를 보자

 

//객체를 생성

Thread2 t2 = new Thread2();

 

//Thread객체를 만들고 위 객체를 인자로 넣기

Thread t = new Thread(t2);

t.start();

쓰레드는 생각보다 어렵지 않다.

 

 

 

3. 쓰레드의 우선순위

 

쓰레드를 동시에 여러개 돌리면 무엇이 먼저 실행될까?

쓰레드는 프로세스를 관리해주는 매니저에 의해 조금씩 서로 실행된다.

그래서 우선순위를 줄 수는 있지만 그렇다고 해서 그 우선순위에 항상 따르는 것은 아니다.

 

우선순위는 1~10까지 있다. 디폴트 값은 5이며

setPriority을 통해 바꿀 수 있다. 메소드를 통해 바꿀 수 있다.

 

10에 가까울수록 먼저 실행될 '확률'이 높아진다.

반대로 1에 가까울수록 나중에 실행될 '확률'이 높아진다.

 

절대적인 것은 아디ㅏ.

 

getPriority 메소드를 통해 현재의 우선순위도 체크가 가능하다.

반응형
Comments