[JAVA8] CompletableFuture

이재훈·2023년 5월 13일
0

JAVA8

목록 보기
11/23

인프런 강의 "더 자바, JAVA8"(백기선님)의 강의를 듣고 정리한 글 입니다.
JAVA8에 추가된 핵심 기능들을 이해하기 쉽게 설명해 주시니 한번씩 들어보시는 것을 추천드립니다.

"더 자바, JAVA8 바로가기"


Concurrent 소프트웨어

  • 동시에 여러 작업을 할 수 있는 소프트웨어
  • 유튜브를 시청하면서 문서 타이핑이 가능하다.
  • 카톡을 하면서 유튜브를 볼 수 있다.

자바에서 지원하는 컨커런트 프로그래밍

  • 멀티프로세싱 (ProcessBuilder)
  • 멀티쓰레드

자바 멀티쓰레드 프로그래밍

  • Thread / Runnable

Thread 상속

public class App {
	public static void main(String[] args) {
		
		MyThread myThread = new MyThread();
		myThread.start();
		
		System.out.println("hello!");
	}
	
	static class MyThread extends Thread {

		@Override
		public void run() {
			System.out.println("Thread : " + Thread.currentThread().getName());
		}
	}
}

위 코드의 결과는 Thread ~가 먼저 출력될 것 같지만 Thread의 순서는 보장을 받지 못하기 때문에 hello가 먼저 출력될 수도 있다.

Runnable 구현 또는 람다

public class App {
	public static void main(String[] args) {
		
		Thread thread = new Thread(new Runnable() {
			
			@Override
			public void run() {
				System.out.println("Thread : " + Thread.currentThread().getName());
				
			}
		});
	
		thread.start();
		
		System.out.println("hello : " + Thread.currentThread().getName());
	}
}

java8 이후에는 람다를 사용하여 구현할 수도 있다.

public class App {
	public static void main(String[] args) {
		
		Thread thread = new Thread(() -> System.out.println("Thread : " + Thread.currentThread().getName()));
	
		thread.start();
		
		System.out.println("hello : " + Thread.currentThread().getName());
	}
}

쓰레드 주요 기능

  • 현재 쓰레드 멈춰두기 (sleep) : 다른 쓰레드가 처리할 수 있도록 기회를 주지만 그렇다고 락을 놔두지는 않는다. (잘못하면 데드락이 걸린다.)
public class App {
	public static void main(String[] args) {
		
		Thread thread = new Thread(() -> {
			try {
				Thread.sleep(1000L);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("Thread : " + Thread.currentThread().getName());	
		});
	
		thread.start();
		
		System.out.println("hello : " + Thread.currentThread().getName());
		
	}
}
  • 다른 쓰레드 깨우기 (interupt) : 다른 쓰레드를 깨워서 interruptedException을 발생시킨다. 그 에러가 발생했을 때 할 일은 코딩하기 나름이다. 종료를 시킬 수도 있고, 계속 하던 일을 할 수도 있다.
public class App {
	public static void main(String[] args) throws Exception{
		
		Thread thread = new Thread(() -> {
			System.out.println("Thread : " + Thread.currentThread().getName());
			while(true) {
				try {
					Thread.sleep(1000L);
				} catch (InterruptedException e) {
					System.out.println("exit");
					return;
				}
			}
		});
	
		thread.start();
		
		System.out.println("hello : " + Thread.currentThread().getName());
		Thread.sleep(3000L);
		thread.interrupt(); // 쓰레드 깨우기
	}
}
  • 다른 쓰레드 기다리기 (join) : 다른 쓰레드가 끝날 때까지 기다린다.
public class App {
	public static void main(String[] args) throws Exception{
		
		Thread thread = new Thread(() -> {
			System.out.println("Thread : " + Thread.currentThread().getName());
				try {
					Thread.sleep(3000L);
				} catch (InterruptedException e) {
					throw new IllegalStateException(e);
				}
		});
	
		thread.start();
		
		System.out.println("hello : " + Thread.currentThread().getName());
		thread.join();
		System.out.println(thread + "is finished"); // 3초 후 출력
	}
}
profile
부족함을 인정하고 노력하자

0개의 댓글