Thread (2)

김재익·2023년 6월 19일
0

JAVA

목록 보기
10/18
post-thumbnail

Thread

자바에서 제공하는 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

자바에서 제공하는 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()로 완료된 프로세스

병렬적으로 처리되는 모습.

profile
개발자호소인

0개의 댓글