스레드(Thread) - 4. Thread의 속성

Ⅳ. Thread의 속성

    ※ 스레드명을 지정하지 않는 경우 thread-0, thread-1과 같이 번호를 1씩 증가시키면서 이름 자동 부여

// Example1
package sample;

// 둘 이상의 스레드를 생성한 연습문제
// 어떤 것이 먼저 처리될까?

class Even implements Runnable {
	public void run() {
		try {
			for(int i = 0; i < 20; i++) {
				if(i % 2 == 0) {
					System.out.println(i + " ");
				}
			}
		} catch(Exception e) {
			e.printStackTrace();	// 스택 메모리 추적 내용을 출력
		}
		
	}
}

class Odd implements Runnable {
	public void run() {
		try {
			for(int i = 0; i < 20; i++) {
				if(i % 2 == 1) {
					System.out.println(i + " ");
				}
				Thread.sleep(100);	// .sleep(100) : 100ms 동안 스레드 휴식
				// sleep()은 예외처리를 해야 함
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
		
	}
}

public class Main {
	public static void main(String[] args) {
		Thread t1 = new Thread(new Even());
		Thread t2 = new Thread(new Odd());
		
		// 먼저 스타트한 애가 먼저 시작함
		t1.start();		// 0 ~ 18 까지 짝수가 출력
		t2.start();		// 1 ~ 19 까지 홀수가 출력
	}
}

 

// Example2
package sample;

// $
class Dollar implements Runnable {
	public void run() {
		for(int i = 0; i < 100; i++) {
			System.out.println("$");
		}
	}
}

// -
class Bar implements Runnable {
	public void run() {
		for(int i = 0; i < 100; i++) {
			System.out.println("-");
		}
	}
}

// 스레드 우선순위 지정하기
public class Main {
	public static void main(String[] args) {
		Thread t1 = new Thread(new Dollar());
		Thread t2 = new Thread(new Bar());
		
		// .setPriority(n) : 우선순위를 정함 (1~10까지 숫자가 높으면 우선순위가 높음)
		// ※ 우선순위가 높다고 해도, 운영체제나 사용 시스템에 따라 결과다 다를 수 있음
		// ※ 또 우선순위가 높다고 해서 무조건 선점하는 것은 아님
		t1.setPriority(5);	
		t2.setPriority(7);
		
		t1.start();		// $ 표시가 100번 출력
		t2.start();		// - 표시가 100번 출력
	}
}

 

// Example3
package sample;

import java.util.concurrent.Executors;	// 스레드풀 생성 클래스
import java.util.concurrent.ExecutorService;

// 스레드가 많으면 메모리 부하 발생
// 스레드풀 : 스레드를 담아두는 집합체
// → 스레드풀을 만들어 CPU가 부담 느끼지 않도록 일처리를 하자

class First implements Runnable {
	public void run() {
		String name = Thread.currentThread().getName();
		System.out.println(name + "은 첫 번째 스레드");
	}
}

class Second implements Runnable {
	public void run() {
		String name = Thread.currentThread().getName();
		System.out.println(name + "은 두 번째 스레드");
	}
}

public class Main {
	public static void main(String[] args) {
		// 스레드 하나짜리 풀 만들어서 서비스 변수로 참조하기
		ExecutorService a = Executors.newSingleThreadExecutor();
		
		// submit() : 작업 전달하기
		a.submit(new First());
		a.submit(new Second());
		
		System.out.println("End : " + Thread.currentThread().getName());
		
		// 스레드풀 안에 주어진 동작을 마치고서 스레드들을 소멸함
		a.shutdown();
	}
}
// 결과 :
// pool-1-thread-1은 첫 번째 스레드
// End : main
// pool-1-thread-1은 두 번째 스레드 가 순서가 바뀌면서 출력

 

// Example4
package sample;

import java.util.concurrent.Executors;	// 스레드풀 생성 클래스
import java.util.concurrent.ExecutorService;

class Work1 implements Runnable {
	public void run() {
		int n1 = 10;
		int n2 = 20;
		String name = Thread.currentThread().getName();
		System.out.println(name + ": " + (n1 + n2));
	}
}

class Work2 implements Runnable {
	public void run() {
		int n1 = 10;
		int n2 = 20;
		String name = Thread.currentThread().getName();
		System.out.println(name + ": " + (n1 - n2));
	}
}

class Work3 implements Runnable {
	public void run() {
		int n1 = 10;
		int n2 = 20;
		String name = Thread.currentThread().getName();
		System.out.println(name + ": " + (n1 * n2));
	}
}

public class Main {
	public static void main(String[] args) {
		Work1 w1 = new Work1();
		Work2 w2 = new Work2();
		Work3 w3 = new Work3();
		
		//newFixedThreadPool(n) : n개의 스레드로 고정
		ExecutorService a = Executors.newFixedThreadPool(2);
		
		a.submit(w1);
		a.submit(w2);
		a.submit(w3);
		
		a.shutdown();
	}
}
// 결과 :
// pool-1-thread-2: -10
// pool-1-thread-1: 30
// pool-1-thread-2: 200 이런 식으로 멀티 스레드가 가능 (thread-n이 매번 바뀜)

    ※ 스레드의 동작을 이해하는 것 일뿐, 어떤 메소드가 사용되는지는 중요 X