검색결과 리스트
Runnable에 해당되는 글 1건
- 2021.05.21 java 8 정리6
글
java 8 정리6
인프런 강의 8일차.
- 더 자바, Java 8 (백기선 강사님)
1. 자바에서 지원하는 Concurrent 프로그래밍
- 멀티프로세싱 (ProcessBuilder)
- 멀티쓰레드
2. 자바 멀티쓰레드 프로그래밍
- Thread / Runnable
- Thread 상속
public static void main(String[] args){
HelloThread helloThread = new HelloThread();
helloThraed.start();
System.out.println("hello = "+ Thread.currentThread().getName());
}
static class HelloThread extends Thread {
@Override
public void run() {
System.out.println("World = "+ THread.currentThread().getName());
}
- Runnable 구현 또는 람다
Thread thread = new Thread(() -> System.out.println("World = "+Thread.currentThread().getName()));
thread.start();
System.out.println("Hello = "+ Thread.currentThread().getName());
- 쓰레드 주요 기능
> 현재 쓰레드 멈춰두기(sleep) : 다른 쓰레드가 처리할 수 있도록 기회를 주지만, 그렇다고 락을 놔주진 않는다. (잘못하면 데드락이 걸릴 수 있다)
> 다른 쓰레드 깨우기(interupt) : 다른 쓰레드를 깨워서 interruptedException을 발생 시킨다. 그 에러가 발생했을 때 할 일은 코딩하기 나름. 종료시킬 수도 있고, 계속 하던 일 할 수도 있고, 사용자 구현 가능
> 다른 쓰레드 기다리기(join) : 다른 쓰레드가 끝날 때 까지 기다린다.
package me.whiteship.java8to11;
import ch.qos.logback.core.util.ExecutorServiceUtil;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class App {
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
myThread.start();
System.out.println("Hello");
Thread thread = new Thread(() -> {
while(true) {
try {
Thread.sleep(3000L);
} catch (InterruptedException e) {
//InterruptedException은 누군가 이 쓰레드를 깨울 때 동작한다.
System.out.println("Interrupted!!");
return;
}
}
});
thread.start();
System.out.println("Thread : " + Thread.currentThread().getName());
//Thread.sleep(3000L);
//thread.interrupt(); 쓰레드 인터럽트 발생
thread.join(); //위 쓰레드가 끝날 때 까지 기다린다.
System.out.println(thread + " is finished"); //join()으로 인해 위 쓰레드 종료될 때 가지 기다린 후 출력됨
//join으로 다른 쓰레드 기다리는 와중에 또 다른 쓰레드에서 인터럽트 발생 시 복잡도가 기하급수적으로 늘어난다
//여러개의 쓰레드를 코딩으로 관리하는 것은 비효율적 & 어렵기 때문에 executor가 나왔다.
}
static class MyThread extends Thread {
@Override
public void run() {
System.out.println("Thread : " + Thread.currentThread().getName());
}
}
}
3. Executors
- 고수준(High-Level) Cuncurency 프로그래밍
> 쓰레드를 만들과 관리하는 작업을 애플리케이션에서 분리
> 그런 기능을 Executors에게 위임
- Executors가 하는 일
> 쓰레드 만들기 : 애플리케이션이 사용할 쓰레드 풀을 만들어서 관리한다.
> 쓰레드 관리 : 쓰레드 생명 주기를 관리한다
> 작업 처리 및 실행 : 쓰레드로 실행할 작업을 제공할 수 있는 API를 제공한다.
- 주요 인터페이스
> Executor: execute(Runnable)
> ExecutorService : Executor 상속 받은 인터페이스로, Callable도 실행할 수 있으며, Executor를 종료시키거나, 여러 Callable을 동시에 실행하는 등의 기능을 제공한다.
> ScheduledExecutorService : ExecutorService를 상속 받은 인터페이스로 특정 시간 이후에 또는 주기적으로 작업을 실행할 수 있다.
- ExecutorService로 작업 실행하기
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(() -> {
System.out.println("Hello = " + Thread.currentThread().getName());
}
- ExecutorService로 멈추기
executorService.shutdown(); //처리중인 작업 기다렸다가 종료
executorService.shutdownNow(); //당장 종료
- Fork/Join 프레임워크
> ExecutorService의 구현체로 손쉽게 멀티 프로세서를 활용할 수 있게끔 도와준다.
package me.whiteship.java8to11;
import java.sql.SQLOutput;
import java.util.concurrent.*;
public class App {
public static void main(String[] args) throws InterruptedException {
/*ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(() -> { //executorService는 만들어서 실행하게 되면 다음 작업이 들어올 때 까지 계속 대기하므로 명시적으로 shutdown을 해주어야 한다.
System.out.println("Thread : "+Thread.currentThread().getName());
});*/
//쓰레드는 2개지만 5개의 작업 실행
ExecutorService executorService = Executors.newFixedThreadPool(2);
//2개의 쓰레드가 나눠서 5개의 작업을 수행한다.
executorService.submit(getRunnable("Hello"));
executorService.submit(getRunnable("World"));
executorService.submit(getRunnable("dhpark"));
executorService.submit(getRunnable("Java"));
executorService.submit(getRunnable("Thread"));
executorService.shutdown(); //graceful shutdown이라고 한다. (현재 진행중인 작업을 전부 마치고 종료)
//executorService.shutdownNow(); //현재 돌고 있는 쓰레드 종료여부와 상관없이 바로 종료*/
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
scheduledExecutorService.schedule(getRunnable("Hello"), 3, TimeUnit.SECONDS); //3초 정도 딜레이 후 getRunnable 실행
scheduledExecutorService.scheduleAtFixedRate(getRunnable("fixedHello"), 1, 2. TimeUnit.SECONDS); //1초만 기다렸다가 2초에 한번씩 출력
}
private static Runnable getRunnable(String message){
return () -> System.out.println(message + Thread.currentThread().getName());
}
}
'Java 정리' 카테고리의 다른 글
java 8 정리8 (0) | 2021.06.02 |
---|---|
java 8 정리7 (0) | 2021.05.26 |
java 8 정리5 (0) | 2021.05.20 |
java 8 정리4 (0) | 2021.05.19 |
java 8 정리3 (0) | 2021.05.17 |