본문 바로가기

분류 전체보기

(236)
ExecutorService의 우아한 종료 만약 고객의 주문을 처리하는 서버를 운영중인데, 서버를 재시작해야 한다고 가정해보자. 이때 고객의 주문을 처리하고 있는 도중에 갑자기 재시작하면 해당 고객의 주문이 제대로 진행되지 못할 것이다. 따라서 새로운 주문 요청은 막고, 이미 진행중인 주문은 모두 완료한 후에 서버를 재시작하는 것이 가장 이상적이다.  이처럼 서비스를 안정적으로 종료하는 것도 매우 중요하다. 이렇게 문제 없이 우아하게 종료하는 방식을 graceful shutdown이라고 한다.ExecutorService의 종료 메서드ExecutorService의 종료 관련 메서드는 다음과 같다.서비스 종료void shutdown()새로운 작업을 받지 않고, 이미 제출된 작업을 모두 완료한 후에 종료한다.논블로킹 메서드이다. 즉, 이 메서드를 호출..
Executor 프레임워크(ExecutorService, Callable, Future) 스레드 풀의 필요성스레드 풀을 사용하면 스레드를 재사용할 수 있어서, 스레드 생성 시간을 절약할 수 있다. 또한 생성되는 최대 스레드 수가 제한되어 무분별하게 스레드가 생성되어 자원을 낭비하는 것을 막을 수 있다. 스레드 풀을 직접 구현하려면 다음과 같은 것들을 고려해야 하기 때문에 매우 까다롭다.스레드가 처리할 작업이 없으면 스레드의 상태를 WAITING 상태로 관리하고, 작업 요청이 오면 RUNNABLE 상태로 변경해야 한다.어떤 생산자가 작업을 만들고, 스레드 풀에 있는 스레드가 소비자가 된다. 따라서 생산자-소비자 문제를 고려해야 한다.자바가 제공하는 Executor 프레임워크는 스레드 풀과 스레드를 관리해주며, Runnable의 문제점과 생산자-소비자 문제까지 해결해준다. 실무에서는 스레드를 직..
[프로그래머스] 등대 https://school.programmers.co.kr/learn/courses/30/lessons/133500?language=java 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr트리간선이 n-1개이고, 모든 등대가 서로 다른 등대로 이동 가능하다.즉, 사이클이 생길 수 없다. 따라서 트리로 바라볼 수 있고 dfs, bfs 같은 트리 순회 방법을 사용할 수 있다.그리디임의의 한 점을 루트 노드라고 생각하여, dfs를 진행한다고 가정하자. 가장 아래인 리프 노드는 불이 켜질 필요가 없다. 즉, dfs를 진행하며 가장 아래인 리프 노드까지 내려간 뒤, 리..
인터럽트 isInterrupted()public class ThreadStopMainV3 { public static void main(String[] args) { MyTask task = new MyTask(); Thread thread = new Thread(task, "work"); thread.start(); sleep(100); log("작업 중단 지시 thread.interrupt()"); thread.interrupt(); log("work 스레드 인터럽트 상태 1 = " + thread.isInterrupted()); } static class MyTask implements Runnable {..
자바에서 자식 메서드가 부모 메서드가 던지는 체크 예외의 하위 타입만 던질 수 있는 이유 자바의 예외 규칙자바에서 부모 클래스를 상속받거나, 인터페이스를 구현할 때 다음과 같은 예외 관련 규칙이 있다.체크 예외부모 메서드가 체크 예외를 던지지 않으면, 재정의된 자식 메서드도 체크 예외를 던질 수 없다.자식 메서드는 부모 메서드가 던질 수 있는 체크 예외의 하위 타입만 던질 수 있다.언체크(런타임) 예외예외 처리를 강제하지 않으므로 상관없이 던질 수 있다.예외 규칙의 이유런타임 예외는 제약이 없지만, 체크 예외는 위와 같은 제약이 있다. 이런 제약을 두는 이유는 무엇일까? 위와 같은 제약이 없다면 어떻게 될까? 다음 예제는 자식 클래스에서 부모 클래스가 던진 예외보다 상위 예외를 던지는 경우이다. (예제 코드일 뿐, 실제로는 컴파일 오류 발생)class Parent { void method()..
스레드의 생명주기 자바 스레드의 생명 주기는 여러 상태로 나뉘어진다.NEW (새로운 상태)스레드가 생성되고 아직 시작되지 않은 상태이다.즉, 스레드 객체(Thread)가 생성되었지만, start() 메서드가 호출되지 않은 상태이다.Runnable (실행 가능 상태)스레드가 실행될 준비가 된 상태이다.start() 메서드가 호출되면 스레드가 Runnable 상태가 된다.CPU 코어 하나 당 한 번에 하나의 스레드만 실행이 가능하기 때문에 Runnable 상태의 스레드라고 해서 반드시 실행 중인 것은 아니다. Runnable 상태에 있는 스레드는 스케줄러의 실행 대기열에 포함되어 있다가 차례로 CPU에서 실행된다.운영체제 스케줄러의 실행 대기열에 있든, CPU에서 실제 실행되고 있든 모두 Runnable 상태이다.Blocke..
Kafka 카프카 구조클러스터: 여러 대의 서버(브로커)로 구성된 카프카 시스템이다.브로커: 카프카 시스템을 구성하는 개별 서버이다.토픽: 메시지들의 특정 카테고리 또는 피드를 나타낸다. 토픽은 데이터를 카테고리화하여 관리할 수 있게 한다. 예를 들어, 다양한 종류의 이벤트나 메시지들을 서로 다른 토픽으로 분류할 수 있다. 또한 하나의 토픽은 여러 소비자가 구독할 수 있다.파티션: 토픽을 구성하는 하위 단위로, 여러 개의 토픽은 여러 개의 파티션으로 나누어질 수 있다. 이를 통해 카프카의 확장성과 병렬 처리 능력을 향상시킨다.세그먼트: 파티션의 데이터를 실제로 저장하는 물리적 파일이다. 카프카는 데이터를 파티션에 순차적으로 기록하지만, 이 데이터는 여러 세그먼트 파일로 나누어 저장된다.파티셔너프로듀서가 데이터를 보..
다익스트라 알고리즘 - 우선순위 큐와 방문 처리에 대해 다익스트라 문제를 풀다가 공식처럼 우선순위 큐를 사용하고, 방문 처리를 하는 느낌이 들었다. "우선순위 큐를 꼭 사용해야 하는가?", "방문 처리를 꼭 해야 하는가?" 라는 궁금증이 들어서 이 글을 작성한다. https://www.acmicpc.net/problem/1753 이 문제를 예로 들자. 입력 값이 다음과 같고, 1번 노드에서 출발한다고 가정하자.5 611 2 21 3 32 3 42 4 53 4 14 5 2 간선을 리스트로 표현하면 다음과 같고, 1 ➡️ 2 ➡️ 3번 노드 순서로 방문했을 때의 모습은 다음과 같다. 이때 큐에는 (4, 7)과 (4, 4)가 담겨있다. (노드 4번까지 오는데 걸린 비용이 각각 7, 4)우선순위 큐를 사용하지 않을 경우(4, 7)을 먼저 poll한다. 그리고 cos..