parallel

046 Executor Service API

February 18, 2024
2024-02-18
parallel, java

강의 메모 - ExecutorService API - 스레드 풀 실행 및 관리 # 개요 # ExecutorService 는 비동기 작업을 실행하고 관리하기 위한 두 가지 메서드를 제공한다 void execute(Runnable r) – 작업을 제출하면 작업을 실행하고 종료한다 Future submit(Callable c) - 작업을 제출하면 작업을 실행함과 동시에 Future 를 반환한다. Future 에는 결과 값을 포함하고 있다 execute() vs submit() # 작업 중단 및 종료 # ExecutorService 는 스레드 풀을 종료하기 위한 두 가지 메서드를 제공한다 void shutdown() - 정상적인 스레드 풀 종료 이전에 제출된 작업은 실행하고 더 이상 새로운 작업은 수락하지 않습니다. ...

047 Executor Service Invoke

February 18, 2024
2024-02-18
parallel, java

강의 메모 - ExecutorService API - 다중 작업 처리 # 개요 # ExecutorService 는 여러 작업을 실행하고 결과를 수집하는 데 사용되는 메서드를 제공한다 ionvokeAll # invokeAll() 은 작업들 중 가장 오래 걸리는 작업 만큼 시간이 소요된다 // 여러 개의 Callable 작업을 동시에 실행하고 모든 작업이 완료될 때까지 블록되며 각 작업의 결과를 나타내는 Future 객체의 리스트를 반환한다 // 작업이 완료되면 Future.isDone()이 true 가 되며 작업은 정상적으로 종료되거나 예외를 던져 종료될 수 있다 // 대기 중에 인터럽트가 발생한 경우 아직 완료되지 않은 작업들은 취소된다 List<Future> invokeAll(Collection tasks) throws InterruptedException // 기본 메서드와 기능은 동일하고 시간 경과와 관련된 부분만 차이가 난다 // 타임아웃이 발생하거나 모든 작업이 완료될 때 까지 블록되며 각 작업의 결과를 나타내는 Future 객체의 리스트를 반환한다 // 타임아웃이 발생한 경우 이 작업 중 일부는 완료되지 않을 수 있으며 완료되지 않은 작업은 취소된다 List<Future> invokeAll(Collection tasks, long timeout, TimeUnit unit) throws invokeAny # invokeAny() 는 작업들 중 가장 짧게 걸리는 작업 만큼 시간이 소요된다 // 여러 개의 Callable 작업을 동시에 실행하고 그 중 가장 빨리 성공적으로 완료된(예외를 던지지 않은) 작업의 결과를 반환한다 // 어떤 작업이라도 성공적으로 완료하면 블록을 해제하고 해당 작업의 결과를 반환한다 // 정상적인 반환 또는 예외 발생 시 완료되지 않은 작업들은 모두 취소된다 T invokeAny(Collection tasks) throws InterruptedException, ExecutionException // 기본 메서드와 기능은 동일하고 시간 경과와 관련된 부분만 차이가 난다 // 주어진 시간이 경과하기 전에 예외 없이 성공적으로 완료된 작업의 결과를 반환한다 T invokeAny(Collection tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException References 강의 : https://www. ...

045 Future

February 15, 2024
2024-02-15
parallel, java

강의 메모 - Future 구조 및 API - 1, 2, 3 # 개요 # 자바에서 Future 는 비동기 작업의 결과를 나중에 가져올 수 있도록 도와주는 인터페이스이다 Future 는 비동기 작업이 완료되었는지 여부를 확인할 수 있고 조건에 따라 작업을 취소할 수 있으며 작업의 결과를 얻는 방법을 제공한다 Future 는 작업의 결과를 가져올 때까지 블로킹되며 여러 작업을 조합하는 문제, 예외 처리의 어려움 등이 존재하는데 이런 단점을 보완하기 위해 자바 8부터는 CompletableFuture 와 같은 개선된 비동기 도구들이 제공되고 있다 Future & Callable # Future 와 Callable 은 자바에서 비동기 작업을 처리하기 위해 서로 관련된 관계를 가진 클래스들이다 Callable 은 비동기 작업의 실행 내용을 정의하는 인터페이스로서 call() 메서드를 구현하여 작업을 정의하고 작업의 결과를 반환한다 Future 은 Callable 에서 반환한 비동기 작업의 결과를 가져오기 위한 인터페이스로서 작업이 완료될 때까지 결과를 기다리거나 작업이 완료되면 결과를 가져올 수 있다 ExecutorService 의 submit() 메서드는 Callable 을 받아 작업을 실행하고 Future를 반환 한다 구조 # // 작업이 이미 완료되었거나 취소되었거나 다른 이유로 취소할 수 없는 경우 => 아무런 일도 발생하지 않으며 false 를 반환한다 // 작업이 시작되지 않은 경우 => 해당 작업은 실행되지 않으며 true 를 반환한다 // 작업이 이미 시작된 경우 => mayInterruptIfRunning 매개변수에 따라 결정된다 1) mayInterruptIfRunning 파라미터가 true 인 경우 => 해당 작업을 중지시키기 위해 현재 작업을 실행 중인 스레드를 인터럽트 한다. ...

044 Runnable Callable

February 14, 2024
2024-02-14
parallel, java

강의 메모 - Runnable and Callable # 개요 # Runnable 과 Callable 은 모두 별도의 스레드에서 실행할 수 있는 작업을 나타내는 데 사용되는 인터페이스이다 두 인터페이스 사이에는 몇 가지 중요한 차이점이 있다 # Runnable # class MyRunnable implements Runnable { public void run() { // 결과를 리턴 하거나 예외를 던질 수 없다 System.out.println("Hello, world!"); } } Callable # class MyCallable implements Callable<Integer> { public Integer call() throws Exception { // 결과를 리턴 하거나 예외를 던질 수 있다 return 10; } } Callable & Future # Future을 우선 리턴하고 Callable의 call() 로직이 완료되면 결과가 들어온다. ...

042 Threadpool

February 13, 2024
2024-02-13
parallel, java

강의 메모 - 스레드 풀 이해와 구현 # 개요 # 스레드 풀 (Thread Pool) 은 다수의 스레드를 미리 생성하고 관리하여 작업을 효율적으로 처리하는 디자인 패턴이다 자바에서는 스레드 풀을 사용할 수 있는 Executor 프레임워크를 제공하고 있다 스레드 풀은 왜 필요한가 # 스레드 풀을 구현할 때 필요한 핵심 요소는 무엇인가 # 스레드 풀 구조 # 작업을 스레드 풀에 등록하면 스레드 풀은 큐에 작업을 저장한다 미리 생성된 스레드는 큐로부터 작업을 하나씩 가져가고 작업을 진행한다 작업을 완료하면 다음 작업을 할당받기 위해 시도한다 스레드가 할당 받을 작업이 없으면 요청이 들어올 때 까지 계속 대기한다 (wait) 할당 받을 작업이 올때까지 스레드가 모두 작업 중이고 큐에 작업이 존재할 경우 스레드를 추가 생성한다 가용할 수 있는 최대 스레드 개수만큼 생성 가능하기 때문에 추가 생성할 수 있음 일반적으로 스레드 생성 개수는 기본 개수와 최대 개수로 제한을 둔다 만약 Queue에 계속해서 작업이 들어오는데 Thread가 모두 working 중이면 Queue에 작업이 계속 쌓이게되어 쓰레드 풀이 예외를 발생시킬 수 있다. ...

043 Executor

February 13, 2024
2024-02-13
parallel, java

강의 메모 - Executor # 개요 # 자바 Executor Framework 는 자바의 java.util.concurrent 패키지에 포함된 스레드 관리와 병렬 처리를 위한 고급 기능들을 제공하는 포괄적인 라이브러리이다 Executor Framework 는 복잡한 스레드 생성, 관리, 동기화 등의 작업을 단순화하고 성능을 향상시키기 위한 다양한 클래스와 인터페이스를 제공하고 있다 Executor Framework # Executor # Executor Framework 의 핵심 인터페이스로서 단일 메서드 execute(Runnable command)를 정의하고 있으며 작업을 제출하면 Executor 구현체가 적절한 스레드를 생성하고 작업을 실행한다 ExecutorService # Executor 의 확장 버전으로서 작업의 제출과 스레드 풀의 종료를 관리하기 위한 메서드들을 추가로 제공한다 ScheduledExecutorService # ExecutorService 의 확장으로 특정 시간 또는 주기적으로 작업을 실행할 수 있도록 스케줄링하는 메서드들을 제공한다 Executor 구현체 # Executor 의 구현체로는 ThreadPoolExecutor,ScheduledThreadPoolExecutor 등이 있다 이들은 스레드 풀의 생성, 관리, 작업 큐, 스레드 생성 및 삭제 정책 등을 다양한 설정으로 제어할 수 있는 강력한 도구이다 Executor # 제출(Submit)된 Runnable 작업을 실행(Execute) 하는 객체 Executor 인터페이스는 각 작업의 실행(실행방법, 스레드 사용, 스케줄링 등의 세부 사항) 과 작업의 제출을 분리하는 방법을 제공한다. ...

038 Cas Algorithm

February 12, 2024
2024-02-12
parallel, java

강의 메모 - CAS (Compare and Swap) 이해와 활용 - 1,2 # 개요 # CAS(Compare and Swap, 비교 후 치환) 는 멀티 스레드 환경에서 스레드 간의 경쟁 조건을 방지하고 락을 사용하지 않고도 공유 변수의 값을 원자적으로 변경하는 방법을 제공한다 CAS 는 CPU 캐시와 메인메모리의 두 값을 비교하고 그 값이 동일할 경우 새로운 값으로 교체하는 동기화 연산으로 여러 스레드가 공유하는 메모리 영역을 보호하는 데 사용된다 CAS 는 락 기반의 동기화보다 경량화되어 있으며 락을 사용하지 않기 때문에 대기하지 않는 넌블록킹 실행이 가능하고 경쟁 조건과 데드락을 피할 수 있다 CAS는 조건에 따라 실패하고 다시 시도해야 할 수 있기 때문에 동시적으로 접근하는 요청의 수가 많은 경쟁 조건일 경우 효율성이 저하될 수 있다 CAS는 주로 하드웨어 수준(CPU) 에서 지원되는 연산이며 Java에서는 java. ...

039 Atomic

February 12, 2024
2024-02-12
parallel, java

강의 메모 - Atomic Variables - 단일연산변수 - 1,2 # 개요 # 단일연산변수는 락을 사용하지 않고도 여러 스레드 간에 안전하게 값을 공유하고 동기화하는 데 사용되며 기본적으로 volatile 의 속성을 가지고 있다 단일연산변수는 원자적인(read-modify-write) 연산을 지원하여 내부적으로 Compare and Swap (CAS) 연산을 사용하여 데이터의 일관성과 안정성을 유지한다 단일연산변수는 간단한 연산의 경우 락을 사용하는 것보다 월등히 빠른 성능을 보여 주지만 연산이 복잡거나 시간이 오래 걸리는 작업은 락을 사용하는 것보다 오버헤드가 커질 수 있다. ...

040 Count Down Latch

February 12, 2024
2024-02-12
parallel, java

강의 메모 - CountDownLatch # 개요 # 하나 이상의 스레드가 다른 스레드에서 수행되는 일련의 작업이 완료될 때까지 기다릴 수 있게 해주는 동기화 보조 도구이다 CountDownLatch는 주어진 카운트로 초기화되고 await 메서드는 현재 카운트가 countDown 메서드의 호출로 인해 0이 될 때까지 블록되며 그 이후에 모든 대기 중인 스레드가 해제되고 await() 이후 처리가 이루어진다 CountDownLatch 은 일회성으로 처리된다. 즉 카운트를 재 설정할 수 없다( 카운트를 재설정하는 버전이 필요한 경우 CyclicBarrier 를 사용한다) 한 스레드가 여러 번 countDown() 을 호출해도 된다 사용 용도 # 여러 개의 스레드가 병렬로 실행되는 경우 특정 작업이 시작되거나 완료될 때까지 다른 스레드들이 기다리도록 할 수 있다 여러 스레드가 초기화 작업을 마칠 때까지 기다렸다가 모든 스레드가 완료되면 마무리 작업을 수행할 수 있습니다. ...

041 Cyclic Barrier

February 12, 2024
2024-02-12
parallel, java

강의 메모 - CyclicBarrier # 개요 # CyclicBarrier 는 공통된 장벽 지점에 도달할 때까지 일련의 스레드가 서로 기다리도록 하는 동기화 보조 도구이다 각 스레드끼리 cycleBarrier을 공유하고 각각 쓰레드에서 await()을 호출해야한다. countDownLatch는 작업 기준이라면, CyclicBarrier는 쓰레드 기준 CyclicBarrier 는 대기 중인 스레드가 해제된 후에 재 사용할 수 있기 때문에 순환 장벽이라고 부른다 CyclicBarrier는 옵션으로 Runnable 명령을 지원하는데 이 명령은 마지막 스레드가 도착한 후에 각 장벽 지점마다 한 번씩 실행되는 장벽액션(barrierAction) 역할을 수행한다 이 Runnable 은 스레드가 장벽 이후 실행을 계속하기 전에 공유 상태를 업데이트하는 데 유용하다 각 하나의 쓰레드가 await()을 호출해야함 각 쓰레드가 await()을 호출하게 되면 -1씩 되어 0이 되는 시점이 있다. ...