쓰레드의 속성 종류
현재 쓰레드 객체 참조 값 얻어오기
객체를 참조할 수 없을 때 Thread클래스이 정적 메서드인 currentThread()메서드를 이용해 현재 쓰레드 객체의 참조값을 얻어올 수 있다.
static Thread Thread.currentThread()
실행중인 쓰레드의 개수 가져오기
현재 실행중인 쓰레드 개수를 알고 싶을 때 사용
static int Thread.activeCount()
쓰레드의 이름 지정 및 가져오기
쓰레드에 이름을 지정.
String setName(String name)
직접 지정하거나 자동으로 부여된 쓰레드의 이름을 가져올 때 사용
String getName()
쓰레드 객체의 속성 다루기 예제
public class ThreadPropertiesTest1 {
public static void main(String[] args) {
//객체 참조하기, 쓰레드의 개수 가져오기
Thread curThread = Thread.currentThread();
System.out.println("현재 쓰레드의 이름 = "+curThread.getName());
System.out.println("동작하는 쓰레드의 개수 = "+Thread.activeCount());
//쓰레드 이름 자동 지정
for(int i=0;i<3;i++){
Thread thread = new Thread();
System.out.println(thread.getName());
thread.start();
}
//쓰레드 이름 직접 지정
for (int i=0;i<3;i++){
Thread thread = new Thread();
System.out.println(thread.getName());
thread.start();
}
// 쓰레드의 개수 가져오기
System.out.println("동작하는 쓰레드의 개수 = " +Thread.activeCount());
}
}
결과
현재 쓰레드의 이름 = main
동작하는 쓰레드의 개수 = 2
Thread-0
Thread-1
Thread-2
Thread-3
Thread-4
Thread-5
동작하는 쓰레드의 개수 = 3
쓰레드의 우선순위
모든 쓰레드는 1부터 10까지 우선순위를 가지고 있음
우선순위를 지정하지 않으면 5의 우선순위를 가짐.
값이 높을 수록 우선순위가 높음
쓰레드 객체의 우선순위 정하기
void setPriority(int priority)
쓰레드 객체의 우선순위 가져오기
int getPriority()
쓰레드의 우선순위 예제
//우선순위
class MyThread extends Thread{
@Override
public void run(){
for(long i = 0;i<10000000; i++){}
System.out.println(getName() + " 우선순위: "+getPriority());
}
}
public class ThreadProperitesTest2 {
public static void main(String[] args) {
//CPU 코어수
System.out.println("코어수: "+Runtime.getRuntime().availableProcessors());
//우선순위 자동 지정
for (int i =0; i<3; i++){
Thread thread = new MyThread();
thread.start();
}
try {Thread.sleep(1000);} catch (InterruptedException e){}
//우선순위 직접 지정
for(int i=0; i<10;i++){
Thread thread = new MyThread();
thread.setName(i+"번째 쓰레드");
if(i==9) thread.setPriority(10);
thread.start();
}
}
}
쓰레드의 데몬 설정
데몬쓰레드: 일반쓰레드가 모두 종료되면 함께 종료되는 쓰레드
예를들어 문서편집프로그램에 일정 간격마다 자동으로 저장하는 기능이 있다. 문서 편집프로그램을 종료하면 자동저장 기능역시 종료되어야 한다.
쓰레드의 데몬 설정은 Thread클래스의 인스턴스 메서드인 setDeamon() 메서드를 사용하며 기본값은 false이다.
void setDeamon(boolean on)
생성한 객체의 데몬 설정 여부는 Thread클래스의 인스턴스 메서드인 isDaemon()메서드를 이용해 언제든지 확인할 수 있다.
boolean isDaemon()
데몬설정시 주의 할 점은 반드시 쓰레드를 실행하기전 즉, start()메서드를 호출하기 전에 설정해야 한다.
쓰레드가 실행되고나면 데몬 설정을 바꿀 수 없다.
쓰레드의 데몬 설정 - 1. 일반 쓰레드
class MyThread extends Thread{
@Override
public void run(){
System.out.println(getName() + ": " +(isDaemon()?"데몬쓰레드":"일반쓰레드"));
for (int i = 0;i<6;i++){
System.out.println(getName()+": "+i+"초");
try{Thread.sleep(1000);} catch (InterruptedException e){}
}
}
}
public class ThreadPropertiesTest3 {
public static void main(String[] args) {
Thread thread1 = new MyThread();
thread1.setDaemon(false);
thread1.setName("thread1");
thread1.start();
try{Thread.sleep(3500);}catch (InterruptedException e){}
System.out.println("main Thread 종료");
}
}
3.5초동안 지속되는 main 쓰레드 내에서 5초 동안 지속하는 MyThread객체를 생성 및 실행한 예다.
여기서 MyThread는 일반 쓰레드로 정의했다.
결과
thread1: 일반쓰레드
thread1: 0초
thread1: 1초
thread1: 2초
thread1: 3초
main Thread 종료
thread1: 4초
thread1: 5초
결과를 살펴보면 프로그램이 시작된 지 3.5초 후 main쓰레드가 종료돼도 MyThread는 자신이 실행이 끝날 때까지 계속 지속된다는 것을 알 수 있다.
다음은 위의 예제와 동일한 조건하에서 MyThread객체를 실행하기 전에 setDaemon(true)로 설정해 데몬 쓰레드로 정의한 것만 다르다.
class MyThread extends Thread{
@Override
public void run(){
System.out.println(getName() + ": " +(isDaemon()?"데몬쓰레드":"일반쓰레드"));
for (int i = 0;i<6;i++){
System.out.println(getName()+": "+i+"초");
try{Thread.sleep(1000);} catch (InterruptedException e){}
}
}
}
public class ThreadPropertiesTest4 {
public static void main(String[] args) {
Thread thread2 = new MyThread();
thread2.setDaemon(true);
thread2.setName("thread2");
thread2.start();
try{Thread.sleep(3500);}catch (InterruptedException e){}
System.out.println("main Thread 종료");
}
}
결과
thread2: 데몬쓰레드
thread2: 0초
thread2: 1초
thread2: 2초
thread2: 3초
main Thread 종료
실행결과를 보면 MyThread가 실행할 내용이 남아있는데 main쓰레드가 종료되면 함께 종료된다.
MyThread는 데몬 쓰레드로 동작함을 알 수 있다.
다음 예제는 main 일반쓰레드 한개와 데몬쓰레드 두개를 지정하고 두번째 데몬쓰레드가 자신을 실행한 main쓰레드가 종료되는 시점에 같이 종료될 것인가? 를 살펴본다.
class MyThread extends Thread{
@Override
public void run(){
System.out.println(getName() + ": " +(isDaemon()?"데몬쓰레드":"일반쓰레드"));
for (int i = 0;i<6;i++){
System.out.println(getName()+": "+i+"초");
try{Thread.sleep(1000);} catch (InterruptedException e){}
}
}
}
public class ThreadPropertiesTest5 {
public static void main(String[] args) {
//일반쓰레드
Thread thread1 = new MyThread();
thread1.setDaemon(false);
thread1.setName("Thread1");
thread1.start();
//데몬쓰레드
Thread thread2 = new MyThread();
thread2.setDaemon(true);
thread2.setName("thread2");
thread2.start();
try{Thread.sleep(3500);}catch (InterruptedException e){}
System.out.println("main Thread 종료");
}
}
결과
Thread1: 일반쓰레드
thread2: 데몬쓰레드
thread2: 0초
Thread1: 0초
Thread1: 1초
thread2: 1초
Thread1: 2초
thread2: 2초
thread2: 3초
Thread1: 3초
main Thread 종료
Thread1: 4초
thread2: 4초
thread2: 5초
Thread1: 5초
두번째 쓰레드는 데몬쓰레드로 지정하였음에도 main쓰레드가 끝난 이후에도 계속 지속되는 것을 알 수 있다.
데몬쓰레드를 호출한 주 쓰레드가 종료되면 데몬쓰레드가 같이 종료되는 것이 아닌.
프로세스 내의 모든 일반 스레드가 종료되어야 데몬스레드가 종료되는 것을 알아야한다.
이 예제에서는 thread1이 끝나지 않아 지속되는 것이다.
'Language > Java' 카테고리의 다른 글
[Java] 쓰레드의 상태 (0) | 2022.04.06 |
---|---|
[Java] 쓰레드의 동기화 (0) | 2022.04.06 |
[Java] 쓰레드, 멀티쓰레드 (0) | 2022.04.05 |
[Java] 예외 전가 (throws) (0) | 2022.04.05 |
[Java] 리소스 자동 해제 예외 처리 (0) | 2022.04.04 |