ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Thread의 기초
    JAVA/Thread 2020. 10. 7. 18:30

    Thread의 개념

    - Process: thread의 집합으로 하나의 exe, com, dll 프로그램을 말한다.
           . 현재 실행되고 있는 프로그램이다.
           . Process간 자원(memory)을 공유할 수 없다.

              따라서 Process를 많이 발생 시키면 자원이 바닥나게 된다.

    - Thread:
         . 독립된 작은 실행단위로 프로세스를 구성.
         . 반복적으로 동기화하여 실행되는 프로그램 루틴.
         . 메소드(함수)단위의 처리 모듈, process의 구성 요소.
         . Thread는 많이 발생해도 자원을 공유함으로 Process에 비해 시스템에 적은 부담.
         . 각각의 Thread는 자신의 일을 하고 있으며, 동시에 실행되지 않는다.
         . 스레드 스케줄러에 의해서 스레드의 여러상태중 실행상태로 변경할 수 있다.
         . 스레드의 상태는 준비상태, 실행상태, 대기상태, 정지상태가 있다.
         . 스레드는 자원을 공유하는 특징이 있어 멤버 필드와 static 필드를 공유.
      - Handle: 메모리 포인터, 함수포인터등의 핸들러, thread의 구성요소.
      - run() 메소드 안에 처리로직을 구현하거나 처리로직을 호출하는 로직이 구현되어 있어야 한다.
      - 네크워크, 게임, 데이터베이스, 웹 관련 프로그램에서 많이 사용
      - 자바의 스레드는 많은 Reference 참조로 인해 C언어의 스레드보다 속도 및 안정성이 떨어져 
          접속자가 많은 네트워크 관련 프로그램에는 사용을 하지 않는다.
         . Hash Code 관리 부분에 많은 리소스가 소모된다.

     

    스레드 콜백 메소드와 기본 메소드 
       - start() : 스레드를 스레드 스케쥴러에 등록하고 실행 상태로 변경. 
                    이 메소드를 실행했다고해서 바로 스레드가 실행이 되는 것은 아니다.
                    JVM은 스레드를 실행할 수 있는 여유가 생겼을 때 자신이 작성한 스레드 스케줄러에
                    의해서 스레드의 run() 메소드를 호출.

       - run() : JVM이 호출하는 콜백메소드로 여기서 콜백 메소드는 개발자가 호출을 코드상에 
                  지시하는 것이 아니라 JVM이 호출하는 메소드를 말하는 것으로 이 run()메소드 안에는 
                  스레드 상태에서 처리하려고 하는 모든 비즈니스 로직이 구현되어 있어야 한다.
                   가장 중요한 메소드이다.

       - sleep(long milli second) : 지정된 시간동안 스레드를 쉬게하고, 그 시간이 지나면 다시 스레드가 작동된다.
                                              (1000ms는 1초이다.) 

       - wait() : 현재를 스레드 무한정 대기 시킨다. notify(), notifyall()메소드를 통해서 재 실행 가능하다. 

       - suspend() : 스레드의 실행을 일시적으로 중단 시킨다. 다시 실행은 resume()를 통해서만 가능하다.

       - yield() : 스레드의 실행 권한을 무조건 다른 스레드에게 넘겨 준다.(양보)

       - stop() : 스레드 실행을 완전히 종료한다.

       - getName() : 쓰레드의 이름을 알려준다.

       - Thread.currentThread() : 는 현재 실행중인 쓰레드를 알려준다.

     

    단일 스레드 : 일반적으로 하나의 자바 프로그램을 만들어 실행하면 단일 스레드 상태가 된다.
                      main()메소드가 대표적인 단일 스레드이다.

    멀티 스레드 :  하나의 메소드가 처리가 끝나는 것이 아니라 여러 메소드가 계속적으로 
                       실행상태에 있으면서 자원을 공유하고 이용하는 처리 형태를 말함.
                       어느 한 메소드가 실행이 종료 되지 않고 다른 메소드와 함께 계속 실행 상태에 있게 되는 것

     

    스레드의 생성 방법
    1. Thread 클래스를 상속받는 방법
    2. Runnable 인터페이스를 구현하는 방법
    3. 자바는 다중 상속이 안됨으로 클래스가 특정 클래스를 상속할 필요가 있는 경우는 
       반드시 Runnable인터페이스를 구현해야 한다. 

     

     

     

    스레드를 이용하지 않은 경우

    아래와 같은 프로그램이 있다고 하고, 그 결과를 예측해보자. 

    프로그램 실행결과는 너무 길어서 간단히 보면

    홍길동 : 0 ~ 99 출력, 개똥이 : 0 ~ 99 출력, 순이 : 0 ~ 99 출력이 된다.

     

     

    스레드를 이용하지 않는 다른 경우

    프로그램 실행결과

     

     

     

    Thread 클래스를 상속받은 경우

     - start() ---> JVM ---> run()
         
    start() : 개발자: 스레드 스케쥴러에 등록                
    run() : JVM이 스레드스케쥴러를 확인후 그 실행 순서에 따라 run()메소드를 호출함. CallBack Method에 해당됨

    CallBack Method : JVM이 자신의 실행 스케쥴러를 만들고 거기에 등록된 순서에 따라 자동으로 호출하는 메소드

     

    위의 클래스를 기반으로 Thread를 사용해보자.

    스레드를 사용하려는 클래스는 Thread를 상속한다.
    start함수는 그냥 생성이 된다.
    run() 함수를 구현하자.
    객체 생성 후 start()함수로 스레드를 실행하라.
    여러 프로그램을 한 번에 실행을 할 때 스레드를 활용한다.

    위의 run함수에서는 실행하고자하는 내용을 적으면 된다.

    프로그램의 실행결과를 예측해보자.

    위의 결과를 보다시피, 스레드는 시 분할로 처리를 하기 때문에 모두 맞아 떨어지지 않는다. 

    즉, 일정한 순서로 나타나지 않고, 위와 같이 뒤죽박죽 처리가 된다.

     

    소스 파일

    ThreadMain2.java
    0.00MB

     

     

     

     

    Thread 클래스를 상속받은 경우

    프로그램 실행결과로 너무 길어서 일부부만 발췌

     

     

     

     

     

    Runnable 인터페이스를 사용한 경우

    Thread클래스는 Runnable인터페이스로 대체가능하다.
    상속 때문에 문제가 발생할 경우(다중 상속 불가)를 대비하여 인터페이스를 사용한다. 
    implements runnable을 사용하여 run() 함수를 구현하고 실제 사용 시 Thread 객체를 생성하고
    Thread의 생성자에 run함수를 구현한 클래스를 주입해서 추상 클래스인 Thread를 생성하여 객체 생성 한다.

    (스레드 내용을 가지고 있는 클래스가 추가적인 기능이 필요해 다른 클래스를 상속받는 경우는
         Thread 클래스를 Extend 할 수 없음으로 반드시 Runnable인터페이스를 상속받아야 한다.

        상속을 받으면서 스레드를 구현하고 싶은 경우 사용하면 된다.)

    아래의 예제를 보자.

    프로그램 실행결과

    아래는 프로그램 실행결과의 일정 부분이다.

    소스 파일

    ThreadMain3.java
    0.00MB

     

     

     

     

    Runnable 인터페이스를 사용한 경우

    프로그램 실행결과의 일부분

     

     

     

     

     

    쓰레드의 기본 메소드와 특징 확인

    아래의 내용을 보자.

    아래는 이 Thread를 이용해서 Thread의 이름을 확인하는 예제이다. 
    이는 나중에 디버깅할 때 유용하다.

    어느 쓰레드에서 문제가 있는지 알아낼 때. 현재의 스레드의 이름을 볼 수 있기 때문이다.

    프로그램 실행결과

    위는 결과의 일부분이다.

     

    소스 파일

    MyRunsMain.java
    0.00MB

     

    'JAVA > Thread' 카테고리의 다른 글

    Thread join  (0) 2020.10.12
    Thread의 State  (0) 2020.10.12
    스레드 자원의 동기화 (키워드 synchronized)  (0) 2020.10.12
    Thread와 자원 공유 - 멤버필드, static필드  (1) 2020.10.08

    댓글

Designed by Tistory.