Java & Spring Boot

[Java] Thread .join()을 활용한 특정 스레드 선행 처리 테스트

Accept 2024. 11. 29. 01:15
package thread.example.join;

import java.math.BigInteger;

public class JoiningThreadsTest {

    public static void main(String[] args) {
        JoiningThreadsTest jtt = new JoiningThreadsTest();
        BigInteger base1 = new BigInteger("2");
        BigInteger power1 = new BigInteger("10");
        BigInteger base2 = new BigInteger("3");
        BigInteger power2 = new BigInteger("20");

        BigInteger result = jtt.calculateResult(base1, power1, base2, power2);
        System.out.println(result);
    }

    public BigInteger calculateResult(BigInteger base1, BigInteger power1, BigInteger base2, BigInteger power2) {
        BigInteger result;
        PowerCalculatingThread thread1 = new PowerCalculatingThread(base1, power1);
        PowerCalculatingThread thread2 = new PowerCalculatingThread(base2, power2);

        thread1.start();
        thread2.start();

        try {
            thread1.join(); // 스레드1 선행 대기
            thread2.join(); // 스레드2 선행 대기
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        result = thread1.getResult().add(thread2.getResult()); // 스레드1 + 스레드2
        return result;
    }

    private static class PowerCalculatingThread extends Thread {
        private BigInteger result = BigInteger.ONE;
        private BigInteger base;
        private BigInteger power;

        public PowerCalculatingThread(BigInteger base, BigInteger power) {
            this.base = base;
            this.power = power;
        }

        @Override
        public void run() {
            for (BigInteger i = BigInteger.ZERO;
                 i.compareTo(power) != 0;
                 i = i.add(BigInteger.ONE)) {
                result = result.multiply(base);
            }
        }

        public BigInteger getResult() { return result; }
    }
}