안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
Thread 의 하위 클래스로 작업 스레드를 정의하면서 작업 내용을 포함시킬 수도 있습니다.
작업 스레드 클래스를 정의하는 방법입니다.
public class WorkerThread extends Thread {
@Override
public void run() {
스레드가 실행할 코드 // run 메서드 재 정의
}
}
Thread thread = new WorkerThread();
=> 코드를 조금 더 절약하려면? 아래처럼 Thread 익명 객체로 작업 스레드 객체를 생성할 수도 있습니다.
Thread thread = new Thread(){
public void run(){
스레드가 실행할 코드
}
}; <= 익명 자식 객체
이렇게 생성된 작업 스레드 객체에서 start() 메서드를 호출하면 작업 스레드는 자신의 run()메서드를 실행하게 됩니다.
thread.start();
예제) 이전 포스팅의 BeepTask 예제를 수정해서 Runnable을 생성하지않고
Thread의 하위 클래스로 작업 스레드를 생성한 것입니다.
import java.awt.Toolkit;
public class BeepThread extends Thread {
@Override
public void run() {
Toolkit toolkit = Toolkit.getDefaultToolkit();
for(int i=0; i<5; i++) {
toolkit.beep();
try { Thread.sleep(500); } catch(Exception e) {}
} // 스레드 실행 내용
}
}
실행 클래스
import java.awt.Toolkit;
public class BeepPrintExample3 {
public static void main(String[] args) {
//how1
Thread thread = new BeepThread(); 비프 객체 생성
//how2
/*Thread thread = new Thread() {
@Override
public void run() {
Toolkit toolkit = Toolkit.getDefaultToolkit();
for(int i=0; i<5; i++) {
toolkit.beep();
try { Thread.sleep(500); } catch(Exception e) {}
}
}
};*/
thread.start(); 비프 스레드 run
for(int i=0; i<5; i++) {
System.out.println("띵");
try { Thread.sleep(500); } catch(Exception e) {}
}
}
}
마찬가지로 비프음이 있기 때문에 각자 실행해보시면 되겠습니다.
스레드의 이름
이름이 큰 역할을 하는 건 아니지만, 디버깅할 때
어떤 스레드가 어떤 작업을 하는지 조사할 목적으로 가끔 사용됩니다.
메인 스레드는 main 이라는 이름을 가지고 있고,
직접 생성한 스레드는 자동적으로 Thread-n 이라는 이름으로 설정됩니다.
n은 스레드 번호를 말합니다.
이름을 설정하고 싶다면 thread.setName("스레드 이름"); 처럼 setName() 메서드로 변경하면 됩니다.
이름을 알고 싶다면 thread.getName(); 처럼 getName() 메서드를 호출하면 됩니다.
setName() 과 getName() 은 Thread의 인스턴스 메서드이므로, 스레드 객체의 참조가 필요합니다.
스레드 객체를 참조하고 있지 않다면
Thread 의 정적 메서드인 currentThread()로 코드를 실행하는
현재 스레드의 참조를 얻을 수 있습니다.
Thread thread = Thread.currentThread();
예제)
public class ThreadNameExample {
public static void main(String[] args) {
Thread mainThread = Thread.currentThread(); 스래드 객체 얻기
System.out.println("프로그램 시작 스레드 이름: " + mainThread.getName());
ThreadA threadA = new ThreadA(); ThreadA 생성
System.out.println("작업 스레드 이름: " + threadA.getName());//이름 얻기
threadA.start(); ThreadA 시작
ThreadB threadB = new ThreadB();ThreadB생성
System.out.println("작업 스레드 이름: " + threadB.getName());//이름 얻기
threadB.start();ThreadB 시작
}
}
ThreadA)
public class ThreadA extends Thread {
public ThreadA() {
setName("ThreadA");
}
public void run() {
for(int i=0; i<2; i++) {
System.out.println(getName() + "가 출력한 내용");
}
}
}
ThreadB)
public class ThreadB extends Thread {
public void run() {
for(int i=0; i<2; i++) {
System.out.println(getName() + "가 출력한 내용");
}
}
}
'자바' 카테고리의 다른 글
JAVA 자바 Thread 자바 스레드 : 스레드(Thread) 상태 /// 스레드 상태 제어(0) (0) | 2017.03.15 |
---|---|
JAVA 자바 Thread 자바 스레드 : 스레드 우선순위 /// 동기화 메서드와 동기화 블록 (0) | 2017.03.15 |
JAVA 자바 Thread 자바 스레드 : 작업 스레드 생성과 실행(1) - Thread 클래스로부터 직접 생성 (0) | 2017.03.15 |
JAVA 자바 Thread 자바 스레드 : 멀티 스레드의 개념 - 프로세스와 스레드, 메인 스래드 (0) | 2017.03.15 |
JAVA 자바 java.time 패키지 / 파싱 Parsing 과 포맷팅 Formatting (0) | 2017.03.15 |