Thread 클래스 상속
Runnable 인터페이스 구현
Lamda 표현식으로 Runnable 인터페이스 구현
public class ThreadExample1{
public static void main(String[] args) {
// 1. Thread 클래스 상속
MyThread1 myThread = new MyThread1();
myThread.start();
System.out.println("Hello, My Child!");
// 2. Runnable 인터페이스 구현
Thread thread = new Thread(new MyThread2());
thread.start();
System.out.println("Hello, My Runnable Child!");
// 3. Lambda로 Runnable 인터페이스 구현
Runnable task = () -> {
try {
while (true) {
System.out.println("Hello, Lambda Runnable!");
Thread.sleep(500);
}
} catch (InterruptedException ie) {
System.out.println("I'm interrupted");
}
};
System.out.println("Hello, My Lambda Child!");
}
}
class MyThread1 extends Thread{
public void run() {
try {
while (true) {
System.out.println("Hello, Thread!");
Thread.sleep(500);
}
} catch (InterruptedException ie) {
System.out.println("I'm interrupted");
}
}
}
class MyThread2 implements Runnable {
@Override
public void run() {
try {
while (true) {
System.out.println("Hello, Runnable!");
Thread.sleep(500);
}
} catch (InterruptedException ie) {
System.out.println("I'm interrupted");
}
}
}
Hello, My Child!
Hello, Thread!
Hello, Thread!
Hello, Thread!
Hello, Thread!
Hello, Thread!
Hello, Thread!
➡️ main thread 에서 MyThread1 생성 → start() → run()
: start() 시점에 아직 contextx-switching이 발생하지 않았으므로 main thread의 Hello, My Child!
를 먼저 출력해준다. 이후 contextx-switching으로 MyThread1의 Hello, Thread!
를 출력해준다.
public class ThreadExample2 {
public static void main(String[] args) {
Runnable task = () -> {
for (int i = 0; i < 5; i++) {
System.out.println("Hello, Lambda Runnable!");
}
};
Thread thread = new Thread(task);
thread.start();
try {
thread.join(); // 이때 돌고 있는건 main
} catch (InterruptedException ie) {
System.out.println("Parent thread is interrupted");
}
System.out.println("Hello, My Joined Child!");
}
}
Hello, Lambda Runnable!
Hello, Lambda Runnable!
Hello, Lambda Runnable!
Hello, Lambda Runnable!
Hello, Lambda Runnable!
Hello, My Joined Child!
➡️ main thread 에서 MyThread1 생성 → start() → run() → join()
: join()에 돌고 있는 main thread가 대기 상태로 들어간다. start()된 task thread가 모두 실행후 main thread의 Hello, My Joined Child!
가 출력된다.
public class ThreadExample3 {
public static void main(String[] args) throws InterruptedException {
Runnable task = () -> {
try {
while (true) {
System.out.println("Hello, Lambda Runnable!");
Thread.sleep(100);
}
} catch (InterruptedException ie) {
System.out.println("I'm interrupted");
}
};
Thread thread = new Thread(task);
thread.start();
Thread.sleep(500);
thread.interrupt();
System.out.println("Hello, My Interrupted Child!");
}
}
Hello, Lambda Runnable!
Hello, Lambda Runnable!
Hello, Lambda Runnable!
Hello, Lambda Runnable!
Hello, Lambda Runnable!
I'm interrupted
Hello, My Interrupted Child!
→ 최근엔 분산처리 환경이 가능해지며, 단일 컴퓨팅 환경이 아닌 수많은 컴퓨팅, 디스크 자원을 활용 함으로서 위 병렬처리 방법에 대한 구분이 무의미해짐