ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 개념 6(thread)
    학교 수업/자바프로그래밍 2020. 4. 23. 18:50

    1:1 채팅프로그램이 아닌 다인원 채팅프로그램을 구현하려면

    서버가 여러 클라이언트와 통신하면서 요청을 처리하기 위해 필요한 쓰레드에 대해 알아야한다.

    (

     서버&클라이언트 1:1이면 thread사용 불필요 

     but 서버 & 클라이언트1 & 클라이언트2 & 클라이언트3... 이면 thead사용해야함

    )

    그래서 therad란 무엇인가?



    thread 쓰레드


    - 개념 : 하나의 프로세스 내부에서 독립적으로 실행되는 하나의 작업 단위

         세부적으로는 운영체제에 의해 관리되는 하나의 작업 혹은 태스크를 의미


    프로세스(Process) :  실행중인 프로그램, 

        프로그램을 실행하면 OS로부터 실행에 필요한 자원(메모리) 할당받아 프로세스가 된다.


    그림으로 자세히 보자면



    - 쓰레드의 생명 주기


     




    1. Runnable (준비상태)

    스레드가 실행되기 위한 준비단계

    CPU를 점유하고 있지않으며 실행(Running 상태)을 하기 위해 대기하고 있는 상태

    코딩 상에서 start( ) 메소드를 호출하면 run( ) 메소드에 설정된 스레드가 Runnable 상태로 진입

    “Ready“ 상태라고도 한다


    2. Running (실행상태)

    스케줄러에 의해 선택된 스레드가 CPU를 점유하여 실행하고 있는 상태이며 run() 메서드는 JVM만이 호출 가능 

    Runnable(준비상태)에 있는 여러 스레드 중 우선 순위를 가진 스레드가 결정되면 JVM이 자동으로 run( ) 메소드를 호출하여 스레드가 Running 상태로 진입


    3. Dead (종료상태)

    Running 상태에서 스레드가 모두 실행되고 난 후 완료 상태

    “Done” 상태라고도 한다

     

    4. Blocked (지연 상태)

    CPU를 점유권을 상실한 상태 -> 스레드가 작업을 완수하지 못하고 잠시 작업을 멈추는 단계

    후에 특정 메서드를 실행시켜 Runnable(준비상태)로 전환한다.

    wait( ) 메소드에 의해 Blocked 상태가 된 스레드는 notify( ) 메소드가 호출되면 Runnable 상태로 간다.

    sleep(시간) 메소드에 의해 Blocked 상태가 된 스레드는 지정된 시간이 지나면 Runnable 상태로 간다.



    - 자바에서 쓰레드 구현 방법


    1. Thread 클래스를 상속

    2. Runnable 인터페이스를 구현


    → thread 클래스를 상속받으면 다른 클래스를 상속 받을 수 없기 때문에, Runnable 인터페이스를 구현하는 방법이 일반적.


    1. Thread 클래스 상속받는 예시 코드


    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
    public class ThreadExam01 {
       public static void main(String[] args){
           MyThread01 m1 = new MyThread01("*");
           MyThread01 m2 = new MyThread01("+");
           MyThread01 m3 = new MyThread01("#");
           m1.start();
           m2.start();
           m3.start();
           System.out.println("main메소드 종료.");
      }
    }
     
    class MyThread01 extends Thread{
       private String str;
       public MyThread01(String str){
           this.str = str;
      }
     
       @Override
       public void run() {
           for(int i = 0; i < 5; i++)
               System.out.print(str);
      }
    }
     
    cs


    2. Runnable 인터페이스를 이용해서 구현하는 코드 예시


    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
    28
    29
    30
    31
    32
    33
    34
    public class ThreadExam02 {
       public static void main(String[] args){
           Runnable r1 = new MyThread02("*");
           Runnable r2 = new MyThread02("%");
           Runnable r3 = new MyThread02("#");
           
           //Thread t1 = new Thread(new MyThread02("*"));
           Thread t1 = new Thread(r1);
           Thread t2 = new Thread(r2);
           Thread t3 = new Thread(r3);
           t1.start();
           t2.start();
           t3.start();
           System.out.println("main메소드 종료.");
      }
    }
     
    class MyThread02 implements Runnable{
       private String str;
       public MyThread02(String str){
           this.str = str;
      }
     
       @Override
       public void run() {
           for(int i = 0; i < 5; i++)
               System.out.print(str);
      }
    }
    /*
    [실행결과]
    *****#####+++++main메소드 종료.
    */
     
    cs


    두 방법 모두 공통적으로는 run()메소드를 상속받아서 오버라이딩 해줘야하며,

     쓰레드 작업을 해줄 곳에 start()호출해 줘야 한다.

    start()호출하면 thread 실행 준비 완료 -> run() 실행시 thread 가 실행




    이 thread 개념을 이용해서 

    서버에서 하나의 클라이언트가 아닌 여러 명의 클라이언트가 접속 요청을 할때

    각 클라이언트와 통신하기 위해 클라이언트마다 새로운 스레드를 생성해서 멀티스레드로 운영한다.


    멀티태스킹과 멀티쓰레딩
    멀티태스킹(Multi-tasking, 다중작업) : 여러 개의 프로세스가 동시에 실행
    멀티스레딩(Multi-threading) : 하나의 프로세스 내에서 여러 쓰레드가 동시에 작업을 수행

     

    - 멀티스레딩의 장점


    ① CPU 사용률을 향상


    ② 자원을 보다 효율적으로 사용 가능


    ③ 사용자에 대한 응답성이 향상


    ④ 작업이 분리되어 코드가 간결



    - 멀티스레딩의 단점 

    : 여러 쓰레드가 같은 프로세스 내에서 자원을 공유하면서 작업을 하기 때문에 발생할 있는 

      동기화(synchronization ) = 트랜잭션, 교착상태(deadlock) 같은 문제들을 고려하며 프로그래밍 해야 한다.



    댓글

Designed by Tistory.