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)
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