2022. 12. 3. 01:00ㆍProgramming/Java
[Java] Thread
[Operate System] Thread (tistory.com)
이전에 스레드를 정리한 것을 이용해서 Java로 다시 학습해보았다.
Thread
자바에서 스레드를 작성하는 방법은 2가지가 존재한다.
- Thread 클래스 상속으로 이용
- Runnable 인터페이스 이용
이 두가지를 하나 씩 해보려고 한다.
Thread - Thread 클래스 이용
Thread 클래스를 상속받아 사용하는 경우이다.
public class Thread1 extends Thread {
int n = 0;
@Override
public void run() {
super.run();
while (true){
System.out.println(n);
n++;
try{
sleep(1000);
}
catch (InterruptedException e){
return;
}
}
}
}
Thread 클래스를 상속받아 사용한다. 안에는 Thread의 메서드들을 오버 라이딩하여 사용한다. 자주 사용하는 메서드는 아래와 같다.
Thread의 메소드 | 내용 |
Thread() | 스레드 객체 생성 |
void run() | 스레드 코드로서 JVM에 의해 호출한다. 개발자는 반드시 이 메소드를 오버라이딩하여 스레드 코드를 작성하여야 한다. 이 메소드가 종료하면 스레드도 종료한다 |
void start() | JVM에게 스레드 실행을 시작하도록 요청 |
void interrupt() | 스레드 강제 종료 |
static void yield() | 다른 스레드에게 실행을 양보한다. |
long getId() | 스레드의 Id |
static void sleep(long miles) | 스레드는 miles 시간 동안 잔다. miles는 밀리초 단위 |
아래 코드에서 위에 스레드 객체 생성하여 run 메서드를 실행하는 과정이다.
public static void main(String[] args) {
Thread1 thread = new Thread1();
thread.run();
}
start 메서드의 경우 해당 메서드의 경우 오버라이딩을 하면 안 된다. start() 메서드는 생성된 스레드 객체를 스케줄링이 가능한 상태로 전환하도록 한다.
thread.start();
아래 코드의 경우 interrupt()를 사용하여 중지를 시켜보았다. 반복문으로 start()를 시켰기에 run이 한 번씩 실행이 되는 것이 아닌 스레드 객체를 만들고 실행시키고 바로 다음 객체를 생성한다. 또한 위의 run코드를 보면 5까지 반복하도록 되어있지만 중간에 if로 n==3일 때 강제 종료를 실행하였기에 5까지 찍히는 것이 아닌 3까지 찍히고 종료가 된다.
package com.example.javabasic.ch04;
public class Thread1 extends Thread {
int n = 0;
@Override
public void run() {
super.run();
while (n <= 5) {
System.out.print(n +" " +'\b');
n++;
try {
sleep(1000);
if (n == 3) {
interrupt();
}
} catch (InterruptedException e) {
return;
}
}
}
public static void main(String[] args) {
for (int i = 0; i <= 5; i++) {
Thread1 thread = new Thread1();
thread.start();
}
}
}
Thread - Runnable 인터페이스
Runnable의 경우 인터페이스로 존재한다. 다만 해당 인터페이스 내에는 run() 메서드 하나만 존재하며 이를 구현하면서 스레드를 구현한다. 이 때 사용을 하다 보면 실제로는 Thread를 상속하는 편이 메서드도 오버 라이딩 목록이 존재하고 간단한 것을 알 수 있다. 다만 상속의 경우 다중 상속이 이루어지지 않지만 여러 개의 인터페이스를 구현하는 것은 가능하기에 확장성은 Runnable이 더 크다는 것을 알 수 있다.
public class Thread2 implements Runnable {
@Override
public void run() {
int n = 0;
while (n <= 5) {
System.out.print(n + " " + '\b');
n++;
}
}
public static void main(String[] args) {
Thread th = new Thread(new Thread2(), "NewNewThread");
System.out.println(th.getName());
th.start();
}
}
이때 Runnable을 통해 구현하려는 스레드는 Thread 생성자에 넣어서 구현이 가능하다. 이때 스레드 이름인 String name은 생략이 가능하다.
Thread(Runnable target, String Name) | Runnable 객체를 이용하고, 이름이 name인 스레드 객체 생성 |
String getName() | 스레드의 이름 리턴 |
'Programming > Java' 카테고리의 다른 글
[Java] 정규표현식 (1) | 2022.12.27 |
---|---|
[Java] Java와 JVM (0) | 2022.11.30 |
[Java] 객체지향설계 - SOLID (0) | 2022.11.21 |
[Java] Stream이란? (0) | 2022.11.15 |
[Java] 객체지향 (0) | 2022.11.14 |