자바

JAVA 자바 Thread 자바 스레드 : 작업 스레드 생성과 실행 - Thread 하위 클래스로부터 직접 생성 / 스레드의 이름

알통몬_ 2017. 3. 15. 11:04
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 



Thread 하위 클래스로부터 직접 생성

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() + "가 출력한 내용");

}

}

}

 


반응형