괴발개발
[강의정리]D43 JAVA - Callable, Runnable 정리 본문
1. Callable
callable은 리턴값이 있다. =>
그래서 .submit으로 리턴값을 빼내고 타입은 future라서 future로 받아줘야 한다.
그리고 그냥 result는 이상한 값으로 나오고 꼭, .get을 써서 빼내와야 한다.
** .submit() 특징 : 예외 발생해도 안죽이고, 재사용함.
Future<String> result = pool.submit(callable);
String msg = result.get(); // Q.겟은 뭐지???
System.out.println("실행 결과 : " +msg);
[리턴값 까지 빼내기]
public class CallMain {
public static void main(String[] args) throws Exception {
//1. 스레드 풀 생성
int n = Runtime.getRuntime().availableProcessors();
ExecutorService pool = Executors.newFixedThreadPool(n);
//2. 작업 내용 명시(Callable : 작업 후 반환값이 있을 경우)
Callable<String> callable = new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("callable 처리");
return "도로로로올오";
}
};
//3. 풀로 부터 스레드를 빌려서 작업 실행 -> 대답해야함(Future로).
//-> 스레드가 예외 발생 시켜도 데려온다.
Future<String> result = pool.submit(callable);
String msg = result.get(); // Q.겟은 뭐지???
System.out.println("실행 결과 : " +msg);
콘솔값 :
callable 처리
실행 결과 : 도로로로올오
[리턴값 못뺀거 : Future 없음. ]
@Override
public String call() throws Exception {
System.out.println("callable 처리");
return "도로로로올오";
}
};
//3. 풀로 부터 스레드를 빌려서 작업 실행 -> 대답해야함(Future로).
//-> 스레드가 예외 발생 시켜도 데려온다.
pool.submit(callable);
콘솔값
callable 처리
**결국 "리턴값"을 나오게 하기 위해서는 msg까지의 변환과정이 필요한 것이다.
[Runnable 혼종] - 각각 다른 스레드로 10번 출력하라는 MISSION이었음.
public class Test {
public static void main(String[] args) throws InterruptedException {
//1.스레드 풀 생성
int n = Runtime.getRuntime().availableProcessors();
ExecutorService pool = Executors.newCachedThreadPool();
//2. 해야할 일 생성 - Thread Pool 출력
Runnable job = new Runnable() {
@Override
public void run() {
System.out.println("Thread pool -" + Thread.currentThread().getName());
}
};
//3. 스레드 풀에서 스레드 요청
for (int i = 0; i < 10; i++) {
pool.submit(job);
}
이렇게 summit을 넣어주면 10번 뽑아낼 수 있다.
여기서 특이했던건,
1. runnable인데 갑자기 summit을 써서 반환값을 만들었다는것.
2. 그리고 ? summit을 쓰고 future에 넣지 않았음.
-> 내 생각에는 그냥 syso 값 보여줄려고 하면 걍 runnable에도 submit 써도 상관없나 봄.
글고 반환값 보여줄 때 future에 넣는거니까. 참 이상함..
2. Runnable
위에거는 혼종이고,
원래 runnable은 리턴값이 없다.
그래서 그냥 .execute() 써서 반환값 없이 종료 시키면 된다.
pool.execute(runable);
execute 특징 * 예외 발생하면 걍 죽임.
public class RunMain {
public static void main(String[] args) throws Exception {
//1. 스레드 풀 생성
int n = Runtime.getRuntime().availableProcessors();
ExecutorService pool = Executors.newFixedThreadPool(n);
//2. 어떤 작업에 쓸 건지 명시(작업시 **반환이 없으면** Runnable)
Runnable runable = new Runnable() {
@Override
public void run() {
System.out.println("runnable 처리");
}
};
//3. 풀로 부터 스레드를 빌려서 작업 실행 -> 대답할 필요 없음. -> 스레드가 예외 발생 시 키면 죽인다.
pool.execute(runable);
* runnable, callable이거 이상하게 까다롭고 짜증남.. 스레드라서 사용 잘 안한다고 해서 , 뭐 복잡하게 공부하기도 애매하고..,,;;
걍 뭐 이런게 있다 정도만 알면 된다고 함.
'BACK END > JAVA' 카테고리의 다른 글
[코드 리뷰]Echo Client+Server (0) | 2023.03.17 |
---|---|
[코드리뷰] Socket - (Server, Clinet) (0) | 2023.03.16 |
[퀴즈 정리] D-45 JAVA(tread 제어, 컨트롤) (0) | 2023.03.15 |
[강의 정리]D45 JAVA(tread 제어, 컨트롤) (0) | 2023.03.15 |
<ZAVA I.O 사용해서 파일 복사하는 2번째 방법> (0) | 2023.03.14 |
Comments