쓰레드의 생성방법은 크게 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() 메서드
- run() 메서드 : run() 메서드는 Runnable 인터페이스나 Thread 클래스에서 구현해야 하는 메서드입니다. 쓰레드가 실행될 때 호출되는 메서드로, 쓰레드가 수행할 작업을 정의합니다. run() 메서드 내부에 작업의 로직을 구현하고, 이 메서드가 모두 실행되면 쓰레드의 실행이 종료됩니다. run() 메서드는 직접 호출하여 실행하는 것이 아니라, 쓰레드가 start() 메서드를 통해 실행될 때 내부적으로 호출됩니다.
- 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());
}
}
'[ BACKEND] > JAVA_객체지향' 카테고리의 다른 글
[JAVA] Thread & Multi Thread란 ? (0) | 2023.06.26 |
---|---|
[JAVA] 내부 클래스 & 예외 처리 (0) | 2023.06.24 |
[JAVA] JAVA 최상위 클래스 Object (0) | 2023.06.21 |
[JAVA] 인터페이스의 등장 (1) | 2023.06.20 |
[JAVA] 다형성 (Polymorphism)과 활용 (0) | 2023.06.19 |