sussa
컴퓨터가 할 일은 컴퓨터가.
sussa
전체 방문자
오늘
어제

블로그 메뉴

    • 분류 전체보기 (58)
      • Language (58)
        • JAVA (58)

    공지사항

    인기 글

    태그

    • Thread
    • singleton
    • Method
    • 개발자
    • 스파르타코딩클럽
    • 최종연산
    • 재귀
    • 자료구조
    • inheritance
    • CSS
    • Web
    • tree
    • binaryTree
    • 상속
    • Stream
    • 다형성
    • Til
    • Algorithm
    • spring
    • recursion
    • DI
    • HTML
    • java
    • 캡슐화
    • Instance
    • 웹개발종합반
    • BinarySearchTree
    • Database
    • Class
    • 조건문

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    sussa

    컴퓨터가 할 일은 컴퓨터가.

    Java Thread_01
    Language/JAVA

    Java Thread_01

    2022. 9. 4. 21:28

    🎯 목표 :

    프로세스와 쓰레드의 개념을 이해하고 Java에서 쓰레드의 활용을 이해

    📒 Process, Thread

    📌 프로세스는 공장 쓰레드는 일꾼

    • 프로세스는 실행중인 프로그램 자원과 쓰레드로 구성되어있다.
    • 쓰레느는 프로세스 내에서 실제 작업을 수행한다.
    • 모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다.
    • 예를들면 메세지를 보낼때 동영상을 보내면서 메세지를 주고받는 경우 두개의 쓰레드가 활성화 되어있는 상태다.

    📌 멀티쓰레드

    • 대부분의 프로그램은 멀티쓰레드로 작성된다
    • 시스템 자원을 보다 효율적으로 사용할수 있다.
    • 사용자에 대한 응답성이 향상된다.
    • 작업이 분리되어 코드가 간결해진다
    • 하지만, 동기화에 주의해야하며 Dead-lock(교착상태)가 발생하지 않도록 주의해야한다.
    • 프로그램 작성 당시 각 쓰레드가 효율적으로 고르게 실행될수 있도록 작성해야한다.

    📌 쓰레드 구현

    • 쓰레드를 구현하는 방법은 Thread 클래스를 상속 받거나, Runnable 인터페이스를 구현하는 방법으로 두가지가 있다.
    • Thread 클래스를 상속받게되면 다른 클래스를 상속받을수 없기 때문에 Runnable 인터페이스를 구현하는 것이 일반적이다.
    class ThreadOne extends Thread {
        @Override
        public void run() { }
    }
    class ThreadTwo implements Runnable {
        @Override
        public void run() { }
    }
    • 쓰레드를 구현하는것은 run(){}메소드를 오버라이딩하여 구현하는것이다.
    • 작성한 쓰레드 클래스는 만들어진 방법별로 인스턴스 생성 과정이 다르다.
    public class ThreadStudy {
        public static void main(String[] args) {
            // Thread 클래스의 상속을 받은 클래스는 일반적인 인스턴스 생성을 하면된다.
            ThreadOne t1 = new ThreadOne();
            // 인터페이스를 구현한 경우 구현한 클래스를 Thread 클래스의 생성자 매개변수에 작성
            Thread t2 = new Thread(new ThreadTwo()); 
            t1.start(); // 쓰레드는 start 메소드로 실행한다
            t2.start();
        }
    }
    // ========== 작성한 쓰레드 클래스=========
    
    class ThreadOne extends Thread {
        @Override
        public void run() {
            for(int i=0; i<5; i++)
                System.out.println(getName());
        }
    }
    class ThreadTwo implements Runnable {
    
        @Override
        public void run() {
            for(int i=0; i<5; i++){
                System.out.println(Thread.currentThread().getName());
            }
    
        }
    }
    • Thread 클래스를 상속받은 경우 Thread의 메소드 getName() 을 직접 호출 할수 있지만, Runnable 인터페이스를 구현한 경우 Thread의 메소드를 직접적으로 접근할수 없기 때문에 currentThread()메소드로 현재 쓰레드를 참조하여 접근할수 있다.
    • 쓰레드는 내부 메소드 run을 호출하는 것이 아닌 start()메소드를 호출하여 실행한다.
    • 쓰레드의 실행 순서는 OS 스케줄러가 결정하며, 코드 작성 순서대로 실행된다는 보장은 없다
    • Thread.getName으로 호출한 쓰레드 이름은 직접 지정하지 않으면 0부터 시작되어 자동 부여된다.
    ===== 출력값 =====
    Thread-0
    Thread-0
    Thread-0
    Thread-0
    Thread-0
    Thread-1
    Thread-1
    Thread-1
    Thread-1
    Thread-1

    📌 start, run

    • start() 호출로 쓰레드를 실행시키는 이유는 start()메소드가 새로운 호출 스택을 생성하기 때문이다.
    • start 호출로 생성된 독립적인 호출 스택에서 run 메소드가 자동으로 호출되게 되며, 독립된 호출 스택에서 쓰레드가 동작하며 run 메소드의 실행이 끝나면 자동으로 호출스택은 사라진다.
    • public 클래스의 main 메소드도 위와 같이 동작한다.

    📌 멀티쓰레드 활용 예제_ I/O 블락킹

    • 싱글 쓰레드로 한 화면에 출력하는 두개의 작업을 실행하는것 보다 멀티 쓰레드로 두개의 작업을 실행하는것이 미세하지만 더 느리다.
    • 싱글 쓰레드는 한 화면으로 출력하는 두개의 작업이 번갈아가면서 실행되는 것이 아닌 하나가 끝나면 나머지 하나를 실행하는 방식이기 때문에, 쓰레드간의 작업전환 시간이 필요 없는데,  멀티쓰레드로 두개의 작업을 동시에 진행하게되면, 쓰레드간 작업 전환 시간이 추가된다.

    출처 자바의 정석

    • 두개의 쓰레드가 다른 자원을 사용하여 작업하는 경우에는 효율적으로 활용할수 있다.
    public class ThreadStudy3 {
        public static void main(String[] args) throws Exception {
            Thread1 th1 = new Thread1();
            th1.start();
    
            String input = JOptionPane.showInputDialog("입력하세요");
            System.out.println("입력값 : " + input );
        }
    }
    class Thread1 extends Thread {
        public void run() {
            for (int i = 10; i > 0; i--) {
                System.out.println(i);
                try {
                    sleep(1000);
                } catch (Exception e) {
                }
            }
        } // run()
    }
    • 먼저 th1 쓰레드가 실행되고, 입력을 받을 창이 실행된다. 위 예제를 public 클래스의 main 메소드 내에서만(=싱글쓰레드) 구현하면 입력 받을 창이 실행되고나면,  입력이 끝날때까지 for문은 실행되지 않고 기다리게 된다.
    • 하지만 위와 같이 멀티 쓰레드로 코드를 구현하게 되면, 입력 받을 창이 실행되고 입력을 하지 않아도 쓰레드의 for문은 계속 실행된다.
    • 아래 출력값을 보면 입력값을 입력하기 전까지 for문이 실행 된것을 확인할수 있다.
    === 출력값 ===
    10
    9
    8
    입력값 : asfsdf
    7
    6
    5
    4
    3
    2
    1

     

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

    Java Thread_03  (0) 2022.09.05
    Java Thread_02  (0) 2022.09.05
    Java Annotation  (1) 2022.09.04
    Java 열거형  (0) 2022.09.03
    Java Generics  (0) 2022.09.03
      'Language/JAVA' 카테고리의 다른 글
      • Java Thread_03
      • Java Thread_02
      • Java Annotation
      • Java 열거형
      sussa
      sussa
      Efforts to take on a challenge

      티스토리툴바