쓰레드란 하나의 '프로세스'를 의미한다. 즉 실행중인 프로그램을 프로세스라고 하고, 그 안에서 프로그램이 동작하려면 쓰레드가 필요하다. 쓰레드를 할당하려면 반드시 메모리가 할당 되어야 한다.
쓰레드 생성
package com.github.dongpani.자바의정석;
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); // 생성자 Thread(Runnable target)
t1.start();
t2.start();
}
}
class ThreadEx1_1 extends Thread {
public void run() {
for(int i=0; i < 5; i++) {
System.out.println(getName()); // 조상인 Thread의 getName()을 호출
}
}
}
class ThreadEx1_2 implements Runnable {
public void run() {
for(int i=0; i < 5; i++) {
// Thread.currentThread() - 현재 실행중인 Thread를 반환한다.
System.out.println(Thread.currentThread().getName());
}
}
}
- 쓰레드를 생성하는 방법은 Thread 클래스를 상속 받거나, Runnable 인터페이스를 구현하거나 둘 중에 하나이다.
동기식 쓰레드
package com.github.dongpani.자바의정석;
public class Ex13_2 {
public static void main(String[] args) {
// 현재시간
long startTime = System.currentTimeMillis();
for(int i=0; i<300; i++)
System.out.printf("%s", new String("-"));
System.out.print("소요시간1:" + (System.currentTimeMillis() - startTime));
for(int i=0; i<300; i++)
System.out.printf("%s", new String("|"));
System.out.print("소요시간2:" + (System.currentTimeMillis() - startTime));
/**
* 하나의 쓰레드가 끝난 후 바로 다음 쓰레드를 생성함.
*/
}
}
- 하나의 작업이 끝나고 다음 작업을 수행한다.
- 소요시간1 -> 소요시간2 순서로 출력됨.
멀티쓰레드
package com.github.dongpani.자바의정석;
public class Ex13_3 {
static long startTime = 0;
public static void main(String[] args) {
ThreadEx3_1 th1 = new ThreadEx3_1();
th1.start(); // 쓰레드 시작 후 기다리지 않음.
startTime = System.currentTimeMillis();
for (int i = 0; i < 300 ; i++)
System.out.printf("%s", new String("-"));
System.out.print("소요시간1: " + (System.currentTimeMillis() - Ex13_3.startTime));
}
}
class ThreadEx3_1 extends Thread {
public void run() {
for(int i=0; i<300; i++)
System.out.printf("%s", new String("|"));
System.out.print("소요시간2: " + (System.currentTimeMillis() - Ex13_3.startTime));
}
}
- 두 개의 쓰레드에서 같은 반복문을 수행.
- 동시에 작업을 수행하므로 작업 순서를 보장하지 않는다.
- (소요시간1, 소요시간2) 가 실행할 때 마다 순서가 다를 수 있음.
I/O블락킹
사용자 입력을 대기한 후 작업실행
싱글쓰레드
package com.github.dongpani.자바의정석;
import javax.swing.*;
public class Ex13_4 {
public static void main(String[] args) throws Exception{
String input = JOptionPane.showInputDialog("아무 값이나 입력하세요.");
System.out.println("입력하신 값은 " + input + "입니다.");
// 카운트 다운
for(int i=10; i > 0; i--) {
System.out.println(i);
try{
Thread.sleep(1000);
}catch(Exception e) {}
}
}
}
실행결과
멀티쓰레드
package com.github.dongpani.자바의정석;
import javax.swing.*;
public class Ex13_5 {
public static void main(String[] args) throws Exception{
ThreadEx5_1 th1 = new ThreadEx5_1();
th1.start();
String input = JOptionPane.showInputDialog("아무 값이나 입력하세요.");
System.out.println("입력하신 값은 " + input + "입니다.");
}
}
class ThreadEx5_1 extends Thread {
public void run() {
for(int i=10; i>0; i--) {
System.out.println(i);
try{
sleep(1000);
}catch (Exception e) {}
}
}
}
- 위 예제외 같은 코딩을 쓰레드를 두 개로 나누어 처리했다.
- 순서가 보장되지 않는다. 먼저 th1인스턴스가 실행되는 도중 input 값이 들어오면 출력한다.
출처: 자바의 정석