728x90

 

쓰레드의 생성방법은 크게 2가지가 있습니다. 어느 쪽을 선택해도 별 차이는 없지만 Thread 클래스를 상속받으면
다른 클래스를 상속받을 수 없기때문에, Runnable 인터페이스를 구현하는 방법이 일반적입니다.

Thread 클래스 상속 : java에서는 java.lang.Thread 클래스를 상속하여 쓰레드를 생성할 수 있습니다. Thread 클래스를 상속받은 사용자 정의 클래스를 만들고, run() 메서드를 오버라이딩하여 쓰레드가 실행할 작업을 정의합니다. 사용자 정의 클래스의 인스턴스를 생성한 후, statr( ) 메서드를 호출하여 쓰레드를 시작합니다.

 

     
     	//Thread class를 상속받아 run() 메서드 overrid한 클래스 정의( 또는 익명클래스)
        class MyThread extends Thread {
                @override 
            public void run() {
                // 쓰레드가 실행할 작업 정의
            }
        }

        // 쓰레드 객체 생성 및 실행
        MyThread thread = new MyThread(); 
        //또는 Thread thread = new Thread(); 
        //-> 이렇게 객체를 선언해도 어차피 Thread를 상속받은 상황이라 가능하다. 
        thread.start(); //statr()메서드를 이용하여 Thread 실행!

 

💡 Run() 메서드와 Start() 메서드

 

  1. run() 메서드 : run() 메서드는 Runnable 인터페이스나 Thread 클래스에서 구현해야 하는 메서드입니다. 쓰레드가 실행될 때 호출되는 메서드로, 쓰레드가 수행할 작업을 정의합니다. run() 메서드 내부에 작업의 로직을 구현하고, 이 메서드가 모두 실행되면 쓰레드의 실행이 종료됩니다. run() 메서드는 직접 호출하여 실행하는 것이 아니라, 쓰레드가 start() 메서드를 통해 실행될 때 내부적으로 호출됩니다.

  2. start() 메서드 : start() 메서드는 Thread 클래스에서 제공하는 메서드로, 쓰레드를 시작하는 역할을 합니다. start() 메서드를 호출하면, 쓰레드는 자신의 run() 메서드를 실행하기 위해 준비되고 , 내부적으로 새로운 실행 흐름을 만들고, 쓰레드가 독립적으로 실행될 수 있도록 준비를 합니다. start() 메서드를 호출한 후에는 별도의 작업이나 제어 없이 쓰레드가 자동으로 실행됩니다. start() 메서드는 한 번만 호출할 수 있습니다. 동일한 쓰레드에 대해 start() 메서드를 다시 호출하면 예외가 발생합니다.

 

Runnable 인터페이스 구현 : java에서는 java.lang.Runnable 인터페이스를 구현하여 쓰레드를 생성할 수 있습니다. Runnable 인터페이스를 구현한 사용자 정의 클래스를 만들고, 내부적으로 Runnable 객체의 run() 메서드를 구하여 쓰레드가 실행할 작업을 정의합니다.
사용자 정의 클래스의 인스턴스를 생성한 후 , Thread 클래스의 생성자에 Runnable 인터페이스를 구현한 객체를 전달합니다. Thread 클래스의 인스턴스의 start( ) 메서드를 호출하여 쓰레드를 시작합니다.

        class MyRunnable implements Runnable { 
        //Runnable interface를 구현한 클래스를 정의함
        //Runnable = Run()의 기능을 정의한 인터페이스(객체)
                @override
            public void run() {
                // 쓰레드가 실행할 작업 정의
            }
        }

        //Runnable  객체 생성 -> Threade 객체 생성 (생성자에 Runnable 객체를 전달)
        MyRunnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);

        //start() 메서드를 이용하여 Thread를 실행
        thread.start();

🚫 재정의한 메서드는 run() 이지만 Thread의 실행은 start() 메서드를 호출!

🚫 Thread 객체는 재사용 할 수 없습니다. ( → 하나의 객체는 한번만 start()가 가능합니다.)

🎈 익명 이너 클래스를 쓰레드 생성에 사용하기


익명 이너 클래스(Anonymous Inner Class)는 이름이 없는 내부 클래스로, 클래스를 정의하면서 동시에 인스턴스를 생성하는 방법입니다.
익명 이너 클래스를 사용하면 스레드에서 직접적으로 클래스를 정의하고 인스턴스를 생성할 수 있으므로, 코드의 간결성과 가독성을 높일 수 있습니다.
주로 간단한 작업이나 임시적인 스레드 생성에 활용됩니다.

        
        Thread thread = new Thread() {
            public void run() {
                // 스레드에서 실행할 코드 작성
            }
        };


        Runnable runnable = new Runnable() { 
        //인터페이스의 객체도 익명이너클래스를 사용하게되면 하위클래스를 직접 만들지 않아도 바로 생성이 가능함
        //new Runnable() { }의 중괄호 안에 미완성인 method run() 메서드를 overriding 하여 전부 기입하여 넘겨주었습니다.  
          public void run() {
                // 스레드에서 실행할 코드 작성
            }
        };

        Thread thread = new Thread(runnable);

 

🎈 Thread의 속성 ( Thread 객체 가져오기 / 이름 / Thread 개수 / 우선순위 / 데몬설정)


currentThread() 메서드 : Thread 클래스의 currentThread() 정적 static 메서드는 현재 실행 중인 쓰레드를 반환하는 정적 메서드입니다. 이 메서드를 호출하면 현재 실행 중인 쓰레드의 참조를 얻을 수 있습니다. 보통 currentThread() 메서드는 다중 쓰레드 환경에서 현재 실행 중인 쓰레드의 정보를 얻기 위해 사용됩니다. 이를 통해 각 쓰레드의 동작을 구분하거나, 특정 작업을 현재 쓰레드에서만 수행할 수 있도록 조건을 검사하는 등의 용도로 활용될 수 있습니다.
static Thread Thread.currentThread() → Thread 참조 객체가 없는 경우에 사용

 

        public class CurrentThreadExample {
            public static void main(String[] args) {
                Thread currentThread = Thread.currentThread(); // 현재 실행 중인 쓰레드 얻기
                System.out.println("현재 실행 중인 쓰레드: " + currentThread.getName());
            }
        }
728x90
반응형

+ Recent posts