본문 바로가기

자바

[스레드] 12. 스레드풀(3)

- 리턴값이 있는 작업 완료 통보

package ex09_execute_submit;

import java.util.concurrent.*;

public class ResultByCallableExample {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(
                Runtime.getRuntime().availableProcessors()     // cpu의 코어수
        );

        System.out.println("[작업 처리 요청]");
        Callable<Integer> task = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int sum = 0;
                for (int i = 0; i < 10; i++) {
                    sum += i;
                }
                return sum;
            }
        };

        Future<Integer> future = executorService.submit(task);

        try {
            int sum = future.get();
            System.out.println("[처리결과] " + sum);
            System.out.println("[작업 처리 완료]");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        executorService.shutdown();
    }
}

결과:

[작업 처리 요청]
[처리결과] 45
[작업 처리 완료]

 

- 작업처리 결과를 외부 객체에 저장

package ex09_execute_submit.exam02;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class ResultByRunnableExample {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(
                Runtime.getRuntime().availableProcessors()
        );

        System.out.println("[작업 처리 요청");
        class Task implements Runnable {
            Result result;
            public Task(Result result) {
                this.result = result;
            }

            @Override
            public void run() {
                int sum = 0;
                for (int i = 0; i < 10; i++) {
                    sum += i;
                }
                result.addValue(sum);
            }
        }
        
        // 공유객체(외부객체)
        Result result = new Result();
        // 두개의 작업을 정의
        Runnable task1 = new Task(result);
        Runnable task2 = new Task(result);

        Future<Result> future1 = executorService.submit(task1, result);
        Future<Result> future2 = executorService.submit(task2, result);

        try {
            result = future1.get();
            result = future2.get();
            System.out.println("[처리 결과]" + result.accumValue);
            System.out.println("[작업 처리 완료");
        }
        catch (InterruptedException e) {}
        catch (ExecutionException e) {}
    }
}

class Result {
    int accumValue;

    synchronized void addValue(int accumValue) {
        this.accumValue += accumValue;
    }
}

결과:

[작업 처리 요청
[처리 결과]90
[작업 처리 완료

'자바' 카테고리의 다른 글

어댑터 패턴  (0) 2022.12.14
dto 복사에 관하여  (0) 2022.12.08
[스레드] 11. 스레드풀(2)  (0) 2022.05.05
[스레드] 10. 스레드풀(1) ExecutorService  (0) 2022.05.01
[스레드] 9. 스레드 그룹  (0) 2022.05.01