자바에서 제공하는 Thread 클래스를 상속받아 쓰레드를 구현한다.
public class Main {
public static void main(String[] args) {
TestThread thread = new TestThread();
thread.start();
}
}
class TestThread extends Thread {
@Override
public void run() {
for (int i = 0; i <100; i++) {
System.out.print("*");
}
}
}
run() 메서드에 작성된 코드가 쓰레드가 수행할 작업이다.
자바에서 제공하는 Runnable 인터페이스를 사용하여 쓰레드를 구현한다.
public class Main {
public static void main(String[] args) {
Runnable run = new TestRunnable();
Thread thread = new Thread(run);
thread.start();
}
}
class TestRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i <100; i++) {
System.out.print("$");
}
}
}
Thread와 Runnable은 클래스와 인터페이스라는 차이가 있다.
다중상속을 지원하지 않는 자바에서 Thread를 상속받아 처리하는 방법은 확장성이 매우 떨어진다.
그러므로 확장성에 유리한 인터페이스인 Runnable을 사용하는게 좋다.
public class Main {
public static void main(String[] args) {
Runnable task = () -> {
int sum = 0;
for (int i = 0; i < 50; i++) {
sum += i;
System.out.println(sum);
}
System.out.println(Thread.currentThread().getName() + " 최종 합 : " + sum);
};
Thread thread1 = new Thread(task);
thread1.setName("thread1");
Thread thread2 = new Thread(task);
thread2.setName("thread2");
thread1.start();
thread2.start();
}
}
쓰레드가 사용하는 메서드는 재사용성이 없을 수도 있기 때문에 쓰레드가 사용되는 메서드 안에서 람다식으로 작성하는 방법이 있다.
public class Main {
public static void main(String[] args) {
Runnable task = () -> {
int sum = 0;
for (int i = 0; i < 20; i++) {
sum += i;
System.out.println(Thread.currentThread().getName() + "계산 중간 결과: " + sum);
}
System.out.println(Thread.currentThread().getName() + " 최종 합 : " + sum);
};
Thread thread1 = new Thread(task);
thread1.setName("thread1");
Thread thread2 = new Thread(task);
thread2.setName("thread2");
thread1.start();
thread2.start();
}
}
// 결과
thread2계산 중간 결과: 0
thread1계산 중간 결과: 0
thread1계산 중간 결과: 1
thread1계산 중간 결과: 3
thread1계산 중간 결과: 6
thread1계산 중간 결과: 10
thread1계산 중간 결과: 15
thread1계산 중간 결과: 21
thread1계산 중간 결과: 28
thread1계산 중간 결과: 36
thread1계산 중간 결과: 45
thread1계산 중간 결과: 55
thread1계산 중간 결과: 66
thread1계산 중간 결과: 78
thread1계산 중간 결과: 91
thread1계산 중간 결과: 105
thread1계산 중간 결과: 120
thread1계산 중간 결과: 136
thread1계산 중간 결과: 153
thread1계산 중간 결과: 171
thread1계산 중간 결과: 190
thread2계산 중간 결과: 1
thread2계산 중간 결과: 3
thread2계산 중간 결과: 6
thread2계산 중간 결과: 10
thread1 최종 합 : 190
thread2계산 중간 결과: 15
thread2계산 중간 결과: 21
thread2계산 중간 결과: 28
thread2계산 중간 결과: 36
thread2계산 중간 결과: 45
thread2계산 중간 결과: 55
thread2계산 중간 결과: 66
thread2계산 중간 결과: 78
thread2계산 중간 결과: 91
thread2계산 중간 결과: 105
thread2계산 중간 결과: 120
thread2계산 중간 결과: 136
thread2계산 중간 결과: 153
thread2계산 중간 결과: 171
thread2계산 중간 결과: 190
thread2 최종 합 : 190
종료 코드 0(으)로 완료된 프로세스
병렬적으로 처리되는 모습.