/ JAVAJUNGSUK

Ch13-3~6. thread

자바의 정석 기초편

0. 목차



Chapter13. 쓰레드

Ch13 - 3. 쓰레드의 구현과 실행

Ch13 - 4. 쓰레드의 구현과 실행 예제

Ch13 - 5. 쓰레드의 실행 : start()

Ch13 - 6. start()와 run()



Ch13 - 3. 쓰레드의 구현과 실행


▶ 쓰레드를 구현하는 2가지 방법

▷ Thread 클래스 상속
class MyThread extends Thread {
    public void run() { // Thread 클래스의 run()을 오버라이딩
        ...
    }
}
▷ Runnable 인터페이스 구현
class MyThread2 implements Runnable {
    public void run() { // Runnable 인터페이스의 추상 메서드 run()을 구현
        ...
    }
}
public interface Runnable {
    public abstract void run();
}
▷ Thread 클래스 상속과 Runnable 인터페이스 구현
  • 상속받아 오버라이딩해서 넣든, 인터페이스 구현해서 넣은 둘 다
    main 메서드에 작업 내용 넣듯이 run()에 작업 내용을 넣는 작업
  • 자바는 단일 상속만 가능하지만
    인터페이스는 상속받은 클래스를 구현할 수도 있으니
    인터페이스 구현이 더 나음

▶ 쓰레드 실행

▷ Thread 클래스 상속 받았을 때
MyThread t1 = new MyTread(); // 쓰레드 생성
t1.start(); // 쓰레드의 실행
▷ Runnable 인터페이스 구현했을 때
Thread t2 = new Thread(new MyThread2());
// 풀어쓰면
Runnable r = new MyThread2();
Thread t2 = new Thread(r); // Thread(Runnable r)

t2.start();
  • Thread(Runnable r) sort(comparator c)
    • Thread(Runnable r)
      • run() 메서드의 구현체를 외부에서 매개 변수로 받음
      • 외부에서 제공한 run() {}을 쓰레드 메서드가 호출 한 것
    • sort(comparator c)
      • sort 메서드가 정렬할 때 필요한 정렬기준을
      • 인터페이스를 통해 받음 compare() {}


Ch13 - 4. 쓰레드의 구현과 실행 예제


▶ 쓰레드 구현

▷ Thread 클래스 상속
class ThreadEx1_1 extends Thread {
	public void run() {
		for(int i=0; i < 5; i++) {
			System.out.println(this.getName()); // this 생략 가능, 조상인 Thread의 getName()을 호출
		}
	}
}

// console 
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
▷ Runnable 인터페이스 구현
class ThreadEx1_2 implements Runnable {
	public void run() {
		for(int i=0; i < 5; i++) {
			// Thread.currentThread() - Thread를 상속 받지 않았기 때문에 this라 쓸 수 X, 현재 실행 중인 Thread를 반환
			System.out.println(Thread.currentThread().getName());
		}
	}
}

// console
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
▷ 멀티 쓰레드 구현
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 {
	public void run() {
		for(int i=0; i < 50; i++) {
			System.out.print(0);
		}
	}
}

class ThreadEx1_2 implements Runnable {
	public void run() {
		for(int i=0; i < 50; i++) {
			System.out.print(1);
		}
	}
}

// console
// 0과 1이 번갈아가며 실행
0000000000000000000000111111111111111111111111111111111111111110000000000000111111111000000000000000
▷ 싱글 쓰레드 구현
class Ex13_1 {
	public static void main(String args[]) {
		
		for(int i=0; i < 50; i++) {
			System.out.print(0);
		}
		
		for(int i=0; i < 50; i++) {
			System.out.print(1);
		}
	}
}

// console
// 0과 1이 섞이지 않음(첫번 째 for문 완료 후 두번 째 for문으로 넘어 감)
0000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111


Ch13 - 5. 쓰레드의 실행 : start()


▶ start()란?

▷ 쓰레드 생성 후, start() 호출을 해야 쓰레드가 실행
ThreadEx1_1 t1 = new ThreadEx1_1(); // 쓰레드 t1 생성
ThreadEx1_1 t2 = new ThreadEx1_1(); // 쓰레드 t2 todtjd

t1.start(); // 쓰레드 t1 실행
t2.start(); // 쓰레드 t2 실행
▷ 쓰레드 t1, t2의 실행 순서는 OS 스케쥴러가 실행 순서 결정
▷ 쓰레드는 OS에 종속적
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(); // 0이 출력
		t2.start(); // 1이 출력
	}
}

class ThreadEx1_1 extends Thread {
	public void run() {
		for(int i=0; i < 50; i++) {
			System.out.print(0);
		}
	}
}

class ThreadEx1_2 implements Runnable {
	public void run() {
		for(int i=0; i < 50; i++) {
			System.out.print(1);
		}
	}
}

// console
0000000000000000000000111111111111111111111111111111111111111110000000000000111111111000000000000000


Ch13 - 6. start()와 run()


▶ run()이 실행되는 과정

▷ start()를 실행했을 때


▷ start()를 실행하지 않았을 때