13.1 프로세스와 쓰레드 (process & thread)
프로세스 : 실행 중인 프로그램 , 자원 (resource) 과 쓰레드로 구성
쓰레드
프로세스 : 쓰레드
하나의 새로운 프로세스를 생성하는 것보다 하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 든다
- 2프로세스 (공장 2개) 1쓰레드 vs 1프로세스 2쓰레드 (1공장 2일꾼 적은 비용)
대부분의 프로그램이 멀티 쓰레드로 작성! 항상 장점이 있는 것은 아닙니다
13-3 스레드의 구현과 실행
Thread클래스를 상속
class MyThread extends Thread{
public void run()
}
Runnable 인터페이스를 구현
class MyThread2 extends Runnable{
public void run() //Runnable 인터페이스의 추사메서드 run() 을 구현
}
package kr.or.test.thread;
/*
*/
public class Ex13_1 {
public static void main(String[] args) {
ThreadEx1_1 t1 = new ThreadEx1_1();
Runnable r = new ThreadEx1_2();
Thread t2 = new Thread(r);
t1.start();
t2.start();
}
}
class ThreadEx1_1 extends Thread { // Thread 클래스를 상속해서 스레드 구현
@Override
public void run() {
for (int i = 0; i < 200; i++) {
System.out.println(getName());
} //조상인 Thread의 getName() 을 호출
}
}
class ThreadEx1_2 implements Runnable { //Runnable 인터페이스를 구현해서 스레드 생성
@Override
public void run() {
for (int i = 0; i < 200; i++) {
//Thread.currentThread() - 현재 실행중인 Thread를 반환합니다
System.out.println(Thread.currentThread().getName());
}
}
}
13-5 스레드의 실행 - start()
13-6 start() 와 run()
13-7 main 쓰레드
main 메서드의 코드를 구행하는 쓰레드
스레드는 사용자 스레드
와 데몬 스레드
두 종류가 존재
package kr.or.test.thread;
/*
*/
public class Ex13_11 {
static long startTime = 0;
public static void main(String[] args) {
ThreadEx11_1 th1 = new ThreadEx11_1();
ThreadEx11_2 th2 = new ThreadEx11_2();
th1.start();
th2.start();
startTime = System.currentTimeMillis();
try {
th1.join(); //main 스레드가 th1의 작업이 끝날 때까지 기다린다.
th2.join(); // main 스레드가 th2 의 작업이 끝날 떄까지 기다립니다
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
System.out.print("소요시간 : " + (System.currentTimeMillis() - startTime));
}
}
class ThreadEx11_1 extends Thread {
@Override
public void run() {
for (int i = 0; i < 300; i++) {
System.out.print(new String("-"));
}
}
}
class ThreadEx11_2 extends Thread {
@Override
public void run() {
for (int i = 0; i < 300; i++) {
System.out.print(new String("|"));
}
}
}
13-11 스레드의 I/O 블락킹 (blocking)
package kr.or.test.thread;
import javax.swing.*;
/*
*/
public class ThreadEx6 {
public static void main(String[] args) {
ThreadEx7_1 th1 = new ThreadEx7_1();
th1.start();
String input = JOptionPane.showInputDialog("아무 값이나 입력하세요.");
System.out.println("입력하신 값은 " + input + " 입니다");
}
}
class ThreadEx7_1 extends Thread {
@Override
public void run() {
for (int i = 10; i > 0; i--) {
System.out.println("i = " + i);
try {
Thread.sleep(1000);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
}
13-14 쓰레드의 우선순위 (priority of thread)
작업의 중요도에 따라 스레드의 우선순위를 다르게 하여 특정 스레드가 더 많은 작업시간을 갖음
package kr.or.test.thread;
/*
*/
public class Ex13_6 {
public static void main(String[] args) {
ThreadEx6_1 th1 = new ThreadEx6_1();
ThreadEx6_2 th2 = new ThreadEx6_2();
th2.setPriority(7);
System.out.println("th1 = " + th1.getPriority());
System.out.println("th2= " + th2.getPriority());
th1.start();
th2.start();
}
}
class ThreadEx6_1 extends Thread {
@Override
public void run() {
for (int i = 0; i < 300; i++) {
System.out.print("-");
for(int x= 0 ;x<1000000;x++);
}
}
}
class ThreadEx6_2 extends Thread {
@Override
public void run() {
for (int i = 0; i < 300; i++) {
System.out.print("|");
for(int x= 0 ;x<1000000;x++);
}
}
}
13-16 스레드 그룹
main 스레드 그룹
에 속한다13-18 데몬 스레드 (daemon thread)
13-20 스레드의 상태
상태 | 설명 |
---|---|
NEW | 스레드가 생성되고 아직 start()가 호출되지 않은 상태 |
RUNNABLE | 실행 중 또는 실행 가능한 상태 |
BLOCKED | 동기화블럭에 의해서 일시정지된 상태(lock이 풀릴 때까지 기다리는 상태) |
WAITING, TIMED_WAITING | 스레드의 작업이 종료되지는 않았지만, 실행가능하지 않은 (unrunnable) 일시정지의 상태. TIMED_WAITING은 일시정지시간이 지정된 경우를 의미 |
TERMINATED | 스레드의 작업이 종료된 상태 |
13-21 스레드의 실행제어
스레드의 실행을 제어할 수 있는 메서드가 제공된다
13-22 sleep()