[Java] Thread / Thread 클래스, Runnable 인터페이스 이용

2022. 12. 3. 01:00Programming/Java

[Java] Thread

 

[Operate System] Thread (tistory.com)

 

[Operate System] Thread

Thread 스레드 - 프로세스 내에서 프로세스의 자원을 이용하는 여러 실행 흐름의 단위이다. 스레드는 프로세스 내의 Code, Data, Heap 영역은 다른 스레드와 공유하고 stack의 영역은 따로 할당 받음 프

skyriv312079.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