괴발개발

[강의정리]D43 JAVA - Callable, Runnable 정리 본문

BACK END/JAVA

[강의정리]D43 JAVA - Callable, Runnable 정리

dinoelll 2023. 3. 16. 17:48

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이거 이상하게 까다롭고 짜증남.. 스레드라서 사용 잘 안한다고 해서 , 뭐 복잡하게 공부하기도 애매하고..,,;; 

걍 뭐 이런게 있다 정도만 알면 된다고 함.

Comments