Ⅳ. 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
'Programming Language > Java' 카테고리의 다른 글
제네릭(Generic) (0) | 2022.07.18 |
---|---|
스레드(Thread) - 5. Thread 동기화 (0) | 2022.07.15 |
스레드(Thread) - 3. Thread의 생성 및 실행방법 (0) | 2022.07.15 |
스레드(Thread) - 2. Multi-Thread의 필요성 (0) | 2022.07.15 |
스레드(Thread) - 1. Program vs. Process vs. Thread의 개념 (0) | 2022.07.15 |