-
Thread의 장점
- 동시성
- 메모리를 공유하여 절약
Thread를 사용하는 방법
- Thread 클래스를 상속받아서 사용
- Runnable 함수형 인터페이스를 구현해서 사용
class MyThread extends Thread { @Override public void run() { System.out.println("MyThread Name: "+Thread.currentThread().getName()); } }
Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("Runnable Thread: "+Thread.currentThread().getName()); } });
Thread thread = new Thread(()->System.out.println("Runnable Thread: "+Thread.currentThread().getName());
Runnable와 Callable의 차이점
- Runnable: 어떤 객체를 리턴하지 않고 Exception을 발생시키지 않습니다.
- Callable: 틋정 객체를 리턴하고 Exception을 발생시킬 수 있습니다.
Executors가 하는 일
- 쓰레드 만들기: 애플리케이션이 사용할 쓰레드 풀을 만들어 관리한다.
- 쓰레드 관리: 쓰레드 생명 주기를 관리한다.
- 작업 처리 및 실행: 쓰레드로 실행할 작업을 제공할 수 있는 API를 제공한다.
주요 인터페이스
- Executor.execute(Runnable)
- ExecutorService: Executor 상속 받은 인터페이스로, Callable도 실행할 수 있으며, Executor를 종료 시키거나, 여러 Callable을 동시에 실행하는 등의 기능을 제공한다.
- ScheduledExecutorService: ExecutorService를 상속받은 인터페이스로 특정 시간 이후에 또는 주기적으로 작업을 실행 할 수 있다.
ExecutorService executorService = Executors.newSingleThreadExecutor(); //executorService.execute(()->System.out.println("ExecutorService Thread: "+Thread.currentThread().getName())); executorService.submit(()->System.out.println("ExecutorService Thread: "+Thread.currentThread().getName())); //다음 작업이 들어올 때까지 대기하기 때문에 프로세스가 죽지 않는다. //명시적으로 셧다운을 해야합니다. executorService.shutdown();
ExecutorService executorService = Executors.newFixedThreadPool(2); //executorService.execute(()->System.out.println("ExecutorService Thread: "+Thread.currentThread().getName())); executorService.submit(()->System.out.println("ExecutorService Thread1: "+Thread.currentThread().getName())); executorService.submit(()->System.out.println("ExecutorService Thread2: "+Thread.currentThread().getName())); executorService.submit(()->System.out.println("ExecutorService Thread3: "+Thread.currentThread().getName())); executorService.submit(()->System.out.println("ExecutorService Thread4: "+Thread.currentThread().getName())); executorService.submit(()->System.out.println("ExecutorService Thread5: "+Thread.currentThread().getName())); executorService.submit(()->System.out.println("ExecutorService Thread6: "+Thread.currentThread().getName())); executorService.submit(()->System.out.println("ExecutorService Thread7: "+Thread.currentThread().getName())); executorService.submit(()->System.out.println("ExecutorService Thread8: "+Thread.currentThread().getName())); executorService.submit(()->System.out.println("ExecutorService Thread9: "+Thread.currentThread().getName())); executorService.submit(()->System.out.println("ExecutorService Thread10: "+Thread.currentThread().getName())); //다음 작업이 들어올 때까지 대기하기 때문에 프로세스가 죽지 않는다. //명시적으로 셧다운을 해야합니다. executorService.shutdown();
long start = System.currentTimeMillis(); ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); scheduledExecutorService.scheduleAtFixedRate(() -> { System.out.println((System.currentTimeMillis()-start)/1000+"초가 지났습니다."); System.out.println("ScheduledExecutorService Thread: "+Thread.currentThread().getName()); } ,3,2, TimeUnit.SECONDS); //맨 처음 3초 후 실행 이후 2초마다 실행 Thread.sleep(10000); System.out.println((System.currentTimeMillis()-start)/1000+"초가 지났습니다. shutdown"); scheduledExecutorService.shutdown();
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executor.html
Executor (Java Platform SE 8 )
An object that executes submitted Runnable tasks. This interface provides a way of decoupling task submission from the mechanics of how each task will be run, including details of thread use, scheduling, etc. An Executor is normally used instead of explici
docs.oracle.com
느낀점
이게 실무적으로 어디에서 사용되는 것일까?
'자바 > 자바8' 카테고리의 다른 글
스트림 (0) 2022.05.01 2. 자바에서 제공하는 함수형 인터페이스 (0) 2022.03.18 Callable과 Future (0) 2022.03.17 1. 함수형 인터페이스와 람다 표현식 소개 (0) 2022.03.11 0. 자바8 학습의 필요성 (0) 2022.03.11