ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Thread 개념 및 Runnable Interface VS Thread Class
    Java 2020. 1. 13. 22:47
    반응형

    Thread란?

    클래스 실행

    • java 명령어를 이용하여 Class를 실행시키면, Java Process가 실행되고, main() 메서드가 수행되면서 하나의 Thread가 실행

    • 많은 Thread 필요시, 생성해주면 됨

    • Java를 사용하여 Web Application을 제공시, WAS를 사용하는데 동일하게 main Thread에서 생성한 Thread들이 수행됨

    Process와 Thread

    • 하나의 Process내에 여러 Thread가 수행, 어떤 Process든 Thread가 하나 이상 수행

    • 여러 Process가 공유하는 하나의 Thread는 없음

    • 아무런 Thread를 생성하지 않아도 JVM을 관리하기 위한 여러 Thread가 존재함(GC 관리 Thread 등)

    Thread가 생긴 이유

    • Process 하나를 시작하는 것보다 Thread를 하나 추가하는 것이 Resource(자원)을 덜 소비하기 때문(lightweight process 라고도 함)

    • Multi Core시대에 단일 Thread보다 다중 Thread로 실행하는 것이 더 빠른 처리를 할 수 있음

    Runnable Interface & Thread Class

    Thread 생성 방법 두 가지

    Runnable Inteface 사용하기 & Thread Class 사용하기

    Thread Class는 Runnable Interface를 구현한 클래스이므로, 어떤 것을 적용하는지의 차이만 있음

    두 개 모두 java.lang Package에 있으므로 별도로 import할 필요가 없음

    Runnable Interface

    선언 메서드 하나임

    // 쓰레드가 시작되면 수행되는 메서드
    void run()

    구현 방법

    pacakge jamie.thread;
    
    public class RunnableSample implements Runnable {
        public void run() {             // Thread가 시작되면 수행되는 메서드 run()
            System.out.println("I'm Jamie");
        }
    }

    사용 방법

    package jamie.thread;
    
    public class RunThreads {
        public static void main(String[] args) {
            RunTreads threads = new RunThreads();
            threads.runBasic();
        }
        public static void runBasic() {
            RunnableSample runnable = new RunnableSample();
            new Thread(runnable).start();                     // Thread를 시작하는 메서드 start()
            System.out.println("Jamie's Runnable");
        }
    }
    
    /* Thread가 시작되면 수행되는 메서드 : run()
     * Thread를 시작하는 메서드 : start()
     * Runnable Interface 구현 or Thread Class 확장시 run() 메서드를 시작점으로 작성
     * Thread 시작은 start()로, 만들지 않아도 Java가 start() 호출시 run() 메서드를 수행하도록 되어있음
     *
     * new Thread(runnable).start();
     * Runnable Interface를 구현한 RunnableSample Class를 Thread로 바로 시작할 수는 없고,
     * Thread Class의 생성자에 해당 객체를 추가하여 시작해주어야 함
     * 그 후 .start()로 Thread 시작
     */

    Thread Class

    Runnable Interface 구현

    매우 많은 생성자 및 메서드 제공

    상속 방법

    pacakge jamie.thread;
    
    public class ThreadSample extends Thread {
        public void run() {             // Thread가 시작되면 수행되는 메서드 run()
            System.out.println("I'm Jamie");
        }
    }

    사용 방법

    package jamie.thread;
    
    public class RunThreads {
        public static void main(String[] args) {
            RunTreads threads = new RunThreads();
            threads.runBasic();
        }
        public static void runBasic() {
            ThreadSample thread = new ThreadSample();
            thread.start();                           // Thread를 시작하는 메서드 start()
            System.out.println("Jamie's Thread");
        }
    }
    
    /* Thread를 확장한 Class의 경우 객체에 바로 start() 메서드 호출 가능
     *
     * 단, JAVA는 다중 상속을 지원하지 않으므로, 상속받아야 하는 Class가 있다면 Runnable 구현 방식으로
     */

    Thread 특징

    Thread가 1개일 때는 모든 프로그램이 순차적으로(sequential) 실행

    Thread가 여러개일 때는 통제되지 않고 실행됨

    • Thread 구현시 start() 메서드 호출 후에는 run() 메서드의 종료 여부와 관계 없이 바로 다음 줄의 코드를 실행

    새로 생긴 Thread가 끝날 때 = run() 메서드가 종료될 때

    반응형

    'Java' 카테고리의 다른 글

    Thread 관련 - Object, ThreadGroup, ThreadLocal, volatile  (0) 2020.01.16
    Thread Class  (0) 2020.01.15
    java.math.BigDecimal  (0) 2020.01.13
    java.util Package  (0) 2020.01.13
    Collection - Map  (0) 2020.01.09

    댓글

Designed by Tistory.