멀티스레드 프로그래밍4 : 스레드 풀을 활용한 구구단

코드

  • Executors.newFixedThreadPool(processCnt); 스레드풀생성
  • 구구단 결과가 리턴값이므로 Callable타입으로 작업 -> 람다식으로 call()메서드 오버라이딩함
    • Runnable타입 : 인터페이스, 스레드 동작 후 리턴할 값이 없음
    • Callable타입 : 인터페이스, 스레드 동작 후 리턴할 값이 있음, 사옹하려면 call()메서드 오버라이딩 필수
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
private static int[][] gugudan = new int[9][9];
private static int dans = 0;

public static void main(String[] args)
throws InterruptedException, ExecutionException {
int processCnt = Runtime.getRuntime().availableProcessors();
System.out.println("VM에서 운용가능한 프로세서 개수: "+processCnt);
ExecutorService es = Executors.newFixedThreadPool(processCnt); //스레드풀생성
System.out.println("작업 시작 전: "+es);

Callable<String> callable = () -> { //람다식으로 call()메서드 오버라이딩
int dan = ++dans;
for(int i=1; i<10; i++){
gugudan[dan-1][i-1] = dan * i;
}
return dan+"작업완료, "+Thread.currentThread().getName();
};

for(int i=0; i<9; i++){
Future<String> guguFuture = es.submit(callable);
new Thread(() -> {
try{
System.out.println(guguFuture.get());
}catch(Exception e){
e.printStackTrace();
}
}).start();
}

Thread.sleep(1000*5); //5초를 sleep하는 이유는 위의 코드들과 섞여서 출력될까봐
System.out.println("작업 종료 후: "+es);
for(int[] dans : gugudan){
for(int num : dans){
System.out.print(num+"\t");
}System.out.println();
}
es.shutdown();
}//end of main