본문 바로가기

Java

로아랑 서버구축을 위한 공부 5일차

이것이 자바다(책) Chap14.8 ~ Chap 15.4

 

기억에 남는 부분 메모

1. 스레드 풀

- 최대로 몇개의 스레드를 만들지 정해 무한정으로 스레드가 생성되는 것을 막는 기능

- 작업큐에 남아있는 작업을 완료 하고 종료할때는 'shutdown()'

- 현재 작업중인거 중단시키고 스레드 풀을 종료시킬 때는 'shutdownNow()'를 사용하고 미처리된 작업 목록이 리턴됨

String[][] mails = new String[1000][3];
for (int i = 0; i < mails.length; i++) {
    mails[i][0] = "abc@abc.com";
    mails[i][1] = "def@def.com";
    mails[i][2] = i + "상품 입고";
}
ExecutorService executorService = Executors.newFixedThreadPool(5);

for (int i = 0; i < 1000; i++) {
    int index = i;
    executorService.execute(new Runnable() {
        @Override
        public void run() {
            String from = mails[index][0];
            String to = mails[index][1];
            String message = mails[index][2];
            System.out.println("<" + Thread.currentThread().getName() + ">" + message);
        }
    });
}

executorService.shutdown();

이렇게 하면 일단 처음에 메일 1000개 생성하고 스레드풀 5개까지 만들어서 아래 반복문에서 병렬적으로 메일 보내는 기능을 실행하는데

프린트 구문 보면 최대 스레드 5까지만 작동되는 걸 확인 할 수 있음

 

스레드풀 생성해서 작업하고 명시적으로 shutdown() 안해주면 메모리에 계속 남아있고 실행되는거로 간주해서 프로그램 종료가 안됨

 

2. Runnable, Callable

작업 처리 완료 후에 리턴값이 없으면 Runnable, 있으면 Callable사용

ExecutorService executorService = Executors.newFixedThreadPool(5);

for (int i = 0; i < 100; i++) {
    int index = i;
    Future<Integer> future = executorService.submit(new Callable<Integer>() {
        @Override
        public Integer call() throws Exception {
            int sum = 0;
            for (int i = 1; i<=index; i++) {
                sum += 1;
            }
            System.out.println("<" + Thread.currentThread().getName() + ">" + index + " 합 계산(" + sum + ")" );
            return sum;
        }
    });

    try {
        int result = future.get();
        System.out.println("리턴값 : " + result);
    } catch (Exception e) {
        System.out.println(e.toString());
    }
}

executorService.shutdown();

- Callable사용 할 때 Future를 이용하고 작업 처리결과를 future를 통해 얻을 수 있음

 

3. Vector

- List와 동일하나 synchronized메소드로 구성되어있어 멀티 스레드가 동시에 접근해도 한 번에 한 작업만 실행됨

 

4. HashSet

Set<Member> set = new HashSet<>();

set.add(new Member("김땡땡", 123));
set.add(new Member("이땡땡", 123));
set.add(new Member("박땡댕", 123));
set.add(new Member("박땡댕", 123));

Iterator<Member> iterator = set.iterator();
while (iterator.hasNext()) {
    Member m = iterator.next();
    if (m.getName().equals("박땡댕")) {
        iterator.remove();
    }
    System.out.println(m.getName());
}
System.out.println("////////////");

for (Member m : set) {
    System.out.println(m.getName());
}

 

for문으로도 돌릴 수 있고 Iterator라는걸로도 돌릴 수 있는데 Iterator로 돌리면서 조건에 맞으면 바로 삭제도 가능

 

5. hashMap, hashtable

- hashMap은 Swift의 Dictionary같은거

- hashMap과 hashtable의 차이점은 비동기화 <-> 동기화 라는거 (ArrayList와 Vector의 차이같이)

 

7.Properties

- Hashtable이랑 거의 같은데 key값이 String만 되는거