본문 바로가기

자바

[스레드] 2. 작업 스레드 생성과 실행 - 2

Thread 하위 클래스로부터 생성

class WorkerThread extends Thread {
    @Override
    public void run() {
        // 스레드가 실행할 코드;
    }
}

Thread thread = new WorkerThread();
thread.start();
Thread thread = new Thread() {
    @Override
    public void run() {
        // 스레드가 실행할 코드;
    }
};

thread.start();

예제

package main;

import java.awt.*;

public class BeepThread extends Thread {
    @Override
    public void run() {
        // 비프음을 5번 반복해서 소리나게 하는 작업
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        for (int i = 0; i < 5; i++) {
            toolkit.beep();

            try {
                Thread.sleep(500);  // 스레드 일시정지
            }catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
package main;

import java.awt.*;

public class BeepPrintExample3 {
    public static void main(String[] args) {
//        Thread thread = new BeepThread();
//        thread.start();

        Thread thread = new Thread() {
            @Override
            public void run() {
                // 비프음을 5번 반복해서 소리나게 하는 작업
                Toolkit toolkit = Toolkit.getDefaultToolkit();
                for (int i = 0; i < 5; i++) {
                    toolkit.beep();

                    try {
                        Thread.sleep(500);  // 스레드 일시정지
                    }catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        thread.start();

        // "띵" 문자열을 5번 출력하는 작업
        for (int i = 0; i < 5; i++) {
            System.out.println("띵");

            try {
                Thread.sleep(500);  // 스레드 일시정지
            }catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

 

스레드의 이름

-> 메인 스레드 이름: main

-> 작업 스레드 이름: Thread-n

thread.getName();

-> 작업 스레드의 이름 변경

thread.setName("스레드 이름");

-> 코드를 실행하는 스레드의 참조 얻기

Thread thread = Thread.currentThread();

 

예제

package main.threadname;

public class ThreadNameExample {
    public static void main(String[] args) {
        Thread thread = Thread.currentThread();
        System.out.println("프로그램 시작 스레드 이름: " + thread.getName());

        Thread threadA = new ThreadA();
        threadA.start();
    }
}
package main.threadname;

public class ThreadA extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 2; i++) {
            System.out.println(getName() + "가 출력한 내용");
        }
    }
}

실행결과:

프로그램 시작 스레드 이름: main
Thread-0가 출력한 내용
Thread-0가 출력한 내용

 

이때 ThreadA의 생성자에서 해당 스레드의 이름을 바꿔준다.

package main.threadname;

public class ThreadA extends Thread {

    public ThreadA() {
        setName("스레드에이");
    }

    @Override
    public void run() {
        for (int i = 0; i < 2; i++) {
            System.out.println(getName() + "가 출력한 내용");
        }
    }
}

결과:

프로그램 시작 스레드 이름: main
스레드에이가 출력한 내용
스레드에이가 출력한 내용

 

참고)

.start() 는 재사용x