3 분 소요

스레드 식별과 속성

지금 어떤 스레드가 실행 되고 있는가?

  1. 동일한 코드를 실행 할 경우에 현재 코드를 실행하는 스레드를 식별하기 위한 속성
  • 스레드를 식별하는 정보들 ``` ID : 스레드의 식별 값

Name: 스레드의 이름

Priority: 스레드의 우선순위 (범위:MIN(0)~MAX(10)) 숫자가 클 수록 우선 순위가 높음

Status: 스레드의 상태 (new, runnable, blocked, waiting, time waiting, terminated)


```java
package javastudy;

public class Proagram3 {

	public static void main(String[] args) {

		Runnable subMain = new Runnable() {

			@Override
			public void run() {
				print();
			}
		};

		Thread th1 = new Thread(subMain);
		Thread th2 = new Thread(subMain);

		th1.start(); // 꼭 있어야 한다
		th2.start(); // 꼭 있어야 한다

		for (int i = 0; i < 100; i++)
			System.out.printf("main: %d\n", i + 1);

	}

	private static void print() {
		for (int i = 0; i < 100; i++)
		try {
			Thread.sleep(20);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
			System.out.printf("sub1 : %d\n", i + 1);
	}
}

sub1 : 55
sub1 : 56
sub1 : 57
sub1 : 58
main: 62
main: 63
main: 64
main: 65

 

위의 코드는 어느 스레드를 사용하는지 모르기때문에 스레드를 식별하기 위해서는 스레드를 식별하는 정보를 추가한다

  • 스레드 식별하기
	private static void print() {

		Thread th = Thread.currentThread();

		for (int i = 0; i < 100; i++) {
			try {
				Thread.sleep(20);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			// 쓰레드 이름 쓰레드 아이디
			System.out.printf("%s[%d] : %d\n", th.getName(), th.getId(), i + 1);
		}
	}
}

hread-1[15] : 2
Thread-0[14] : 2
Thread-1[15] : 3
Thread-0[14] : 3
Thread-0[14] : 4
Thread-1[15] : 4
Thread-0[14] : 5
Thread-1[15] : 5
Thread-1[15] : 6

위의 코드같은 경우는 스레드의 이름과 아이디가 나왔지만 지정을 하지 않았기 때문에 무슨 스레드인지 모른다 따라서 지정을 해줘서 무슨 스레드인지 식별한다

package javastudy;

public class Proagram3 {

	public static void main(String[] args) {

		Runnable subMain = new Runnable() {

			@Override
			public void run() {
				print();
			}
		};

		Thread th1 = new Thread(subMain);
		th1.setName("sub1");
		Thread th2 = new Thread(subMain);
		th2.setName("sub2");
		th1.start(); // 꼭 있어야 한다
		th2.start(); // 꼭 있어야 한다

		for (int i = 0; i < 100; i++)
			System.out.printf("main: %d\n", i + 1);
	}

	private static void print() {

		Thread th = Thread.currentThread();

		for (int i = 0; i < 100; i++) {
			try {
				Thread.sleep(20);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			// 쓰레드 이름 쓰레드 아이디
			System.out.printf("%s[%d] : %d\n", th.getName(), th.getId(), i + 1);
		}
	}
}

sub2[15] : 2
sub1[14] : 2
sub1[14] : 3
sub2[15] : 3
sub1[14] : 4
sub2[15] : 4
sub2[15] : 5
sub1[14] : 5
sub2[15] : 6
sub1[14] : 6
sub2[15] : 7
sub1[14] : 7
sub1[14] : 8
sub2[15] : 8
sub1[14] : 9
sub2[15] : 9

 

  • 메인 스레드를 지울 경우
package javastudy;

public class Proagram3 {

	public static void main(String[] args) {

		Runnable subMain = new Runnable() {

			@Override
			public void run() {
				print();
			}
		};

		Thread th1 = new Thread(subMain);
		th1.setName("sub1");
		Thread th2 = new Thread(subMain);
		th2.setName("sub2");
		th1.start(); // 꼭 있어야 한다
		th2.start(); // 꼭 있어야 한다

		print();
	}

	private static void print() {

		Thread th = Thread.currentThread();

		for (int i = 0; i < 100; i++) {
			try {
				Thread.sleep(20);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			// 쓰레드 이름 쓰레드 아이디
			System.out.printf("%s[%d] : %d\n", th.getName(), th.getId(), i + 1);
		}
	}
}

메인스레드는 지정하지 않아도 출력된다

main[1] : 1
sub1[14] : 1
sub2[15] : 1
main[1] : 2
sub2[15] : 2
sub1[14] : 2
main[1] : 3
sub1[14] : 3
sub2[15] : 3
main[1] : 4

메인 스레드도 아래와 같이 이름을 지정해서 사용 가능하다

package javastudy;

public class Proagram3 {

	public static void main(String[] args) {

		Runnable subMain = new Runnable() {

			@Override
			public void run() {
				print();
			}
		};

		Thread th1 = new Thread(subMain);
		th1.setName("sub1");
		Thread th2 = new Thread(subMain);
		th2.setName("sub2");

		th1.start(); // 꼭 있어야 한다
		th2.start(); // 꼭 있어야 한다

		Thread th = Thread.currentThread();
		th.setName("Main");

		print();
	}

	private static void print() {

		Thread th = Thread.currentThread();

		for (int i = 0; i < 100; i++) {
			try {
				Thread.sleep(20);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			// 메인일 경우 다르게 호출하고 싶을경우

			if (th.getName().equals("Main"))
				System.out.printf("<%s[%d] : %d\n", th.getName(), th.getId(), i + 1);
			else
				System.out.printf("%s[%d] : %d\n", th.getName(), th.getId(), i + 1);
		}
	}
}
sub2[15] : 1
sub1[14] : 1
<Main[1] : 1
sub2[15] : 2
sub1[14] : 2
<Main[1] : 2
sub2[15] : 3
sub1[14] : 3
<Main[1] : 3
sub2[15] : 4
sub1[14] : 4
<Main[1] : 4

카테고리:

업데이트:

댓글남기기