스레드 생성과 우선순위 (Runnable 인터페이스 & Thread 상속)
✅ 개요
이전에 멀티스레딩의 필요성과 기초 지식에 대해 공부했었다.
https://jie0025.tistory.com/569
이번에는 스레드를 생성하는 2가지 방법과, 스레드의 우선순위에 대해 알아보자.
✅ Runnable 인터페이스를 구현하여 스레드 생성하기
Thread를 생성하는 첫번째 방법은 Runnable 인터페이스를 구현하는것이다.
Runnable 인터페이스에는 run()이 정의되어있기 때문에 @Override를 통해 해당 스레드가 어떻게 동작할지 정의해주면 된다.
public class NewRunnable implements Runnable {
@Override
public void run() {
String name = Thread.currentThread().getName();
System.out.println(name + " 스레드가 시작되었습니다.");
}
}
Runnable을 구현하는 방법을 사용할 경우
Runaable을 인자로 받는 Thread 생성자를 이용해야한다.
Thread 객체를 생성하고, Runnable을 할당해,
Thread 객체에 대한 start()메소드를 호출하면 된다.
아래와 같이 Thread 생성자를 통해 스레드를 만들고, Runnable을 매개변수로 주는 방법이 존재한다.
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
//스레드 동작
}
});
💻 Example
package org.example;
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("현재 스레드 이름은 : " + Thread.currentThread().getName());
System.out.println("이 스레드의 우선순위는 : " +Thread.currentThread().getPriority());
}
});
thread.setName("새로운 스레드 A");
thread.setPriority(Thread.MAX_PRIORITY);
System.out.println("현재 스레드 이름은 : " + Thread.currentThread().getName() + " 새로운 스레드 시작 이전");
thread.start();
System.out.println("현재 스레드 이름은 : " + Thread.currentThread().getName() + " 새로운 스레드 시작 이후");
Thread.sleep(10000);
}
}
✅ Thread 클래스 상속으로 스레드 생성하기
java.lang.Thread 클래스를 상속하는 방법이 있다.
Thread클래스는 아래 이미지에서 볼 수 있듯 Runnable을 구현하고 있기 때문에
상속받으면 Runnable을 자연스럽게 구현하게 된다.
Thread 클래스에는 많은 메소드가 존재하고, 우리는 run()을 Override해주면 된다.
package org.example;
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread thread = new NewThread();
thread.setName("새로운 스레드");
thread.setPriority(1);
thread.start();
}
private static class NewThread extends Thread {
@Override
public void run() {
System.out.println("현재 스레드 이름은 : " + Thread.currentThread().getName());
System.out.println("이 스레드의 우선순위는 : " +Thread.currentThread().getPriority());
}
}
}
✅ 스레드의 우선순위
자바는 스레드 스케줄러가
스레드의 우선순위에 따라 - 스레드를 프로세서를 할당하는 <멀티스레딩 환경>에서 작동한다.
스레드 우선순위의 값이 높을수록 더 먼저 실행될 기회를 얻는다.
⏺ Default 우선 순위 : 5
우선순위를 설정하지 않으면 기본적으로는 5로 할당된다.
package org.example;
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread thread = new NewThread();
thread.start();
}
private static class NewThread extends Thread {
@Override
public void run() {
System.out.println("이 스레드의 우선순위는 : " +Thread.currentThread().getPriority());
}
}
}
상수도 사용할 수 있다.
public static int NORM_PRIORITY
⏺ 최소 우선 순위
public static int MIN_PRIORITY
최소 우선순위 값은 1이다.
⏺ 최대 우선 순위
public static int MAX_PRIORITY
최대 우선순위 값은 10이다.
만약 우선순위가 각각 1, 2, 3인 스레드 A, B, C가 있다고 가정하자.
이때 자바는 우선순위가 높은 순서대로(C > B > A) 더 많이 실행시킬 가능성을 만든다.
(우선순위가 높다해서 제일 먼저 끝나는게 보장되는건 아니다)
아래 예제는
A는 100번대, B는 200번대, C는 300번대의 숫자를 출력하도록 하는 코드인데
출력결과를 미리 보자.
- 300번대와 200번대가 100번대보다 더 많이 앞단에 나오는 것을 확인할 수 있다.
- 또한 100번대가 마지막 즈음에 자주 나오는것도 확인할 수 있다.
- C -> A -> B 순서대로 종료되었는데 이는 우선순위가 높다고 먼저 끝나는게 보장되지 않음을 보여준다.
package org.example;
public class Main {
public static void main(String[] args) throws InterruptedException {
//✅ 우선순위가 다른 스레드 3개 생성
Thread a = new A();
a.setName("A");
a.setPriority(1);
Thread b = new B();
b.setName("B");
b.setPriority(2);
Thread c = new C();
c.setName("C");
c.setPriority(3);
//✅ 스레드 시작
a.start();
b.start();
c.start();
}
private static class A extends Thread {
@Override
public void run() {
System.out.println("현재 스레드 이름은 : " + Thread.currentThread().getName() + ", 이 스레드의 우선순위는 : " +Thread.currentThread().getPriority());
for(int i = 101; i <= 199; i++) {
System.out.print(i + " ");
}
System.out.println(Thread.currentThread().getName() + "스레드 종료");
}
}
private static class B extends Thread {
@Override
public void run() {
System.out.println("현재 스레드 이름은 : " + Thread.currentThread().getName() + ", 이 스레드의 우선순위는 : " +Thread.currentThread().getPriority());
for(int i = 201; i <= 299; i++) {
System.out.print(i + " ");
}
System.out.println(Thread.currentThread().getName() + "스레드 종료");
}
}
private static class C extends Thread {
@Override
public void run() {
System.out.println("현재 스레드 이름은 : " + Thread.currentThread().getName() + ", 이 스레드의 우선순위는 : " +Thread.currentThread().getPriority());
for(int i = 301; i <= 399; i++) {
System.out.print(i + " ");
}
System.out.println(Thread.currentThread().getName() + "스레드 종료");
}
}
}
References
Udemy
https://www.geeksforgeeks.org/java-thread-priority-multithreading/