이것이 자바다(책) 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만 되는거
'Java' 카테고리의 다른 글
로아랑 서버구축을 위한 공부 6일차 (2) | 2024.07.20 |
---|---|
로아랑 서버구축을 위한 공부 4일차 (0) | 2024.07.18 |
로아랑 서버구축을 위한 공부 3일차 (1) | 2024.07.17 |
로아랑 서버구축을 위한 공부 2일차 (0) | 2024.07.16 |
로아랑 서버구축을 위한 공부 1일차 (0) | 2024.07.15 |