[Routine] 5 주차 시작!
in Daily on Routine
![[Routine] 5 주차 시작!](/assets/img/daily/routine/2023/2023-02-19/2023-02-19-myroutine-5th.png)
“2023년 2월 13일 부터 2월 19일 까지의 나의 루틴.”
#목차
2023-02-13
- 오늘 아침도 어김없이 영한님과 함께 출근하였다.
- 출근 후 오늘 오전에는 내가 2020년부터 읽었던 책들을 블로그에 올리는 기초작업을 하였다.
- 2020년도에는 읽었다라고만 도서 기록 앱으로 등록하고 독후감을 작성하지 않았다.
- 확실히 기록하는 습관이 무엇이든 기억에 오래 남는다는 것을 다시 한번 느끼게 된 거 같다.
2023-02-14
- 오늘은 정기검진을 받는 날이라 아침 일찍 CT와 위내시경을 하기 위해 오전 7시까지 구로 고대 병원에 도착했다.
- 오전 7시에 채혈검사를 하고 8시쯤에 심전도 검사하고 10시쯤에 CT 촬영하고 11시 좀 넘어서 위내시경 검사를 했다.
- 중간에 대기 시간들이 많아 영한 님의 인강을 들으면서 대기했다.
- 정기 검진이 끝나고 치과 가서 정기검진을 받고 집에 들어오니까 오후 3시가 됐다.
- 너무 배가 고파서 치킨을 사 와서 먹고 그 자리에서 2시간가량을 잠이 든 거 같다.
- 일어나서 다시 저녁 먹고 블로그 정리하다가 자려고 한다.
- 요새는 내가 읽었던 책들을 포스팅 작업을 하고 있다.
- 생각보단 많이 읽지 못한 거 같아 아쉽긴 하다.
- 그래도 이번 연도에는 기술서들을 많이 읽을 예정이다. 내가 개인적으로 좋아하는 책들은 기술서를 다 읽고 읽을 예정이다.
- 내일을 위해 블로그 작업을 조금만 하고 자야겠다.😪
2023-02-15
- 오늘도 어김없이 영한 님과 함께 출근을 하고 회사 도착하자마자 이것이 자바다 공부를 하였다.
- 과거 포스팅들은 공부한 얘기만 들어가 있어 내가 정확히 그때 공부를 어디서부터 어디까지 무엇을 했는지 기억이 나질 않았다.
- 그래서 오늘부터는 내가 한 공부를 기록하기로 하였다. 그것이 더 머릿속에 오래 남을 거 같기 때문이다.
멀티 스레드
yeild()
“
yeild()
를 호출한 스레드는 실행 대기 상태로 돌아가고, 다른 스레드가 실행 상태가 된다.”
- 스레드가 처리하는 작업은 반복적인 실행을 위해티
for
문이나while
문을 포함하는 경우가 많다. - 무의미한 반복을 하는 경우가 있을 수 있는데 이때
Thread
는yield()
메서드를 제공한다.
Continue with yeild() Commit
스레드 동기화 메서드 및 블록 선언
“스레드가 사용중인 객체를 다른 스레드가 변경할 수 없도록 하려면 스레드 작업이 끝날 때까지 객체에 잠금을 걸면 되는데, 이를 위해 Java는
synchronized
메서드와 블록을 제공한다.”
public class Synchronized {
// example 1
public synchronized void mathodA() {
// 단 하나의 스레드만 실행하는 영역
}
// example 2
public void methodB() {
// 여러 스레드가 실행할 수 있는 영역
synchronized (공유객체) {
// 단 하나의 스레드만 실행하는 영역
}
// 여러 스레드가 실행할 수 있는 영역
}
}
Continue with synchronized Commit
wait()과 notify()를 이용한 스레드 제어
“경우에 따라서는 두 개의 스레드를 교대로 번갈아 가며 실행할 때도 있다. 정확한 교대 작업이 필요할 경우, 자신의 작업이 끝나면 상대방 스레드를
일시 정지
상태에서 플어주고 자신은일시 정지
상태로 만들면 된다..”
- 한 스레드가 작업을 완료하면
notify()
메소드를 호출해서 일시 정지 상태에 있는 다른 스레드를 실행 대기 상태로 만들고 - 자신은 두 번 작업을 하지 않도록
wait()
메소드를 호출하여 일시 정지 상태로 만든다.
Continue with wait(),notify() Commit
- 퇴근 역시 영한님과 함께 하며 집에 와서 홈트와 오늘 공부한 포스팅 작업, 그리고 books log 작업을 하였다.
2023-02-16
- 오늘도 영한님과 출근을 함께 하였다.
- 영한님의 모든 개발자를 위한 HTTP 웹 기본 지식 강의를 거의 다 들어간다.
멀티 스레드
스레드 안전 종료
- 스레드는 자신의
run()
메서드가 모두 실행되면 자동적으로 종료되지만, 경우에 따라서는 실행 중인 스레드를 즉시 종료할 필요가 있다. - 유튜브 같은 동영상을 끝까지 보지 않고 사용자가 멈춤을 요구하는 경우이다.
- 스레드를 안전하게 종료하는 방법은 사용하던 리소스들을 정리하고
run()
메서드를 빨리 종료하는 것. - 주로
조건 이용 방법
과interrup()
메서드 이용 방법을 사용한다.
조건 이용
- 스레드가
while
문을 반복 실행할 경우, 조건을 이용해서run()
메서드의 종료를 유도할 수 있다. - 다음 코드는
stop
필드 조건에 따라서run()
메서드의 종료를 유도한다.public class XXXThread extends Thread { private boolean stop; // stop 필드 선언 public void run() { while (!stop) { // stop이 true가 되면 while 문을 빠져나간다. // 스레드가 반복 실행하는 코다; } // 스레드가 사용한 리소스 정리 }// 스레드 종료 }
Continue with Conditional Utilization Thread Commit
interrupt() 메서드
interrupt()
메서드는 스레드가 일시 정지 상태에 있을 때InterruptedException
예외를 발생시키는 역할을 한다.- 이것을 이용하면 예외 처리를 통해
run()
메서드를 정상 종료시킬 수 있다. - 스레드가 실행 대기/실행 상태일 때에는
interrupt()
메서드가 호출되어도InterruptException
이 발생하지 않는다.
- 스레드가 실행 대기/실행 상태일 때에는
- 그러나 스레드가 어떤 이유로 일시 정지 상태가 되면,
InterruptException
예외가 발생한다. - 그래서 짧은 시간이나마 일시 정지를 위해
Thread.sleep(1)
을 사용한 것. - 일시 정지를 만들지 않고도
interrupt()
메서드 호출 여부를 알 수 있는 방법이 있다. Thread
의interrupted()
와isInterrupted()
메서드는interrupt()
메서드 호출 여부를return
한다.boolean status = Thread.interrupted(); boolean status = objThread.isInterrupted();
// file: "InterruptPrintThread.java" public class InterruptPrintThread extends Thread { public void run() { try { while (true) { System.out.println("실행 중"); // 방법 1. 일시 정지를 만듦 (InterruptedException 이 발생할 수 있게) Thread.sleep(1); // 방법 2. interrupted() 메서드를 통해 interrupt() 메서드가 호출 되었다면 while 문을 빠져 나가게 if (Thread.interrupted()) { break; } } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(("리소스 정리")); System.out.println(("실행 종료")); } }
// file: "InterruptExample.java" public class InterruptExample { public static void main(String[] args) { Thread thread = new InterruptPrintThread(); thread.start(); try { Thread.sleep(1000); } catch (InterruptedException e ) { e.printStackTrace(); } thread.interrupt(); // interrupt() 메서드 호출 } // 결과 ------------------------------- // 실행 중 // ... // java.lang.InterruptedException: sleep interrupted // at java.base/java.lang.Thread.sleep(Native Method) // at ch14.multi_thread.InterruptPrintThread.run(InterruptPrintThread.java:8) }
Continue with Interrupt Thread Commit
데몬 스레드
- 데몬 스레드는 주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드.
- 주 스레드가 종료되면 데몬 스레드도 따라서 자동 종료된다.
- 스레드를 데몬으로 만들기 위해서는 주 스레드가 데몬이 될 스레드의
setDaemon(true)
를 호출하면 된다. - 다음 예를 보면 메인 스레드는 주 스레드,
AutoSaveThread
는 데몬 스레드가 된다.public class DaemonExample { public static void main(String[] args) { AutoSaveThread thread = new AutoSaveThread(); thread.setDaemon(true); thread.start(); // ... } }
- 오후에는 이직한 직원과 오랜만에 만나서 저녁을 먹고 집에 들어왔다.
- 10시까지 수다를 열심히 떨고 각자 집에 들어갔다.😪
Continue with Daemon Thread Commit
2023-02-17 스터디
- 오늘도 어김없이 영한 님의 강의를 들으면서 출근했다.
- 드디어 모든 개발자를 위한 HTTP 웹 기본 지식 강의를 다 듣고 실전! 스프링 부트와 JPA 활용 1 - 웹 애플리케이션 개발을 수강할 예정이다.
멀티 스레드
스레드 풀⭐️⭐️⭐️⭐️⭐️
- 병렬 작업 처리가 많아지면 스레드의 개수가 폭증하여 CPU가 바빠지고 메모리 사용량이 늘어난다.
- 이에 따라 애플리케이션의 성능 또한 급격히 저하된다.
- 이렇게 병렬 작업 증가로 인한 스레드의 폭증을 막을면
스레드풀(ThreadPool)
을 사용하는 것이 좋다. - 스레드풀은 작업 처리에 사용되는 스레드를 제한된 개수만큼 정해 놓고 작업
큐(Quere)
에 들어오는 작업들을 스레드가 하나씩 맡아 처리하는 방식. - 작업 처리가 끝난 스레드는 다시 작업 큐에서 새로운 작업을 가져와 처리한다.
- 이렇게 하면 작업량이 증가해도 스레드의 개수가 늘어나지 않아 애플리캐이션의 성능이 급격히 저하되지 않는다.
- 스레드풀에 작업 처리 요청
- 작업 큐(Queue)가
선입선출
의 방식으로 비어있는 스레드에 작업 할당.- 이때, 가장 먼저 작업이 끝나 비어있는 스레드에 큐에있는 작업을 할당하게 된다.
- 스레드는 해당 작업을 처리
- 결과 전달
스레드풀 생성
메소드명(매개변수) | 초기 수 | 코어 수 | 최대 수 |
---|---|---|---|
newCachedThreadPool() | 0 | 0 | Integer.MAX_VALUE |
newFixedThreadPool(int nThreads) | 0 | 생성된 수 | nThreads |
// 정적 메서드로 호출하고 return하는 것은 ExecutorService의 구현객체이다.
// ExecutorService 인터페이스로 대입을 받아야 한다.
// 아래가 스레드 풀이라고 생각하면 된다.
public class createThreadPool {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool(); // 정적 메서드로 호출
ExecutorService executorService = Executors.newCachedThreadPool(5); // 정적 메서드로 호출
}
}
// 좀 더 구체적인 스레드 풀 생성
public class createDetailThreadPool {
public static void main(String[] args) {
ExecutorService threadPool = new ThreadPoolExecutor(
3, // 코어 스레드 개수
100, // 최대 스레드 개수
120L, // 놀고 있는 시간
TimeUnit.SECONDS, // 놀고 있는 시간 단위
new SynchronousQueue<Runnable>() // 작업 큐
);
}
}
스레드풀 종료
- 스레드풀의 스레드는 기본적으로 데몬 스레드가 아니기 때문에
main
스레드가 종료되더라도 작업을 처리하기 위해 계속 실행 상태로 남아있다. - 스레드풀의 모든 스레드를 종료하려면
ExecutorService
의 다음 두 메서드 중 하나를 실행해야 한다.
리턴 타입 | 메서드명(매개변수) | 설명 |
---|---|---|
void | shutdown() | 현재 처리 중인 작업뿐만 아니라 작업 큐에 대기하고 있는 모든 작업을 처리한 뒤에 스레드풀을 종료 |
List | shutdownNow() | 현재 작업 처리 중인 스레드를 interrupt해서 작업을 중지시키고 스레드풀을 종료시킨다. 리턴값은 작업 큐에 있는 미처리된 작업(Runnable)의 목록이다. |
작업 생성과 처리 요청
- 하나의 작업은 Runnable 또는 Callable 구현 클래스로 표현한다.
- Runnable의
run()
메서드는 리턴값이 없고, Callable의call()
에서드는 리턴값이 있다.
Runnable 익명 구현 클래스 | Callable 익명 구현 클래스 |
---|---|
new Runnable() { | new Callable |
call()
의 리턴 타입은Callable<T>
에서 지정한T
타입 파라미터와 동일한 타입이여야 한다.- 작업 처리 요청을 위해
ExecurotService
는 다음 두 가지 메서드를 제공한다.
리턴 타입 | 메서드명(매개변수) | 설명 |
---|---|---|
void | execute(Runnable command) | - Runnable을 작업 큐에 저장 - 작업 처리 결과를 리턴하지 않음 |
Future | submit(Callable | - Callable을 작업 큐에 저장 - 작업 처리 결과를 얻을 수 있도록 Future를 리턴 |
Continue with ThreadPool Commit
스터디 발표
왕돼지티라노의 기록 - JPA 영속성 관리1
^.^ - 쿠키vs세션vs토큰vs캐시
자바스크립트 내장객체
- String 객체
- indexOf(), replace()
- concat() : 2개 이상의 문자열을 하나의 문자열로 합침.
- trim() : 문자열 앞,뒤 공백 제거
- padStart()/padEnd() : 문자열 앞/뒤에 지정된 문자를 지정된 길이만큼 추가
- charAt(), split()
- startWith()/endsWith() : 해당 문자열로 시작/끝 되는지 확인.
- 퇴근 역시 영한님의 인강을 들으면서 퇴근하고, 집에 도착하자마자 내가 읽은 책 포스팅 작업을 하였다.
- 생각보다 많아 시간이 많이 걸릴거 같다..😂
2023-02-18
- 오늘은 아침 9시에 일어났다.. 늦잠을 자버렸다…😅
- 어제 정리하던 책 첫 포스팅을 작업하고 커밋 하였다.
- 그리고 이번 달까지 이것이자바다를 끝낼 예정이며 다음 주 일요일에 독학사 시험이라 독학사 공부를 다시 1주일간 시작하려 한다…😂
- 11시 30분까지 공부를 하고 여자친구를 만나 세종문화회관에서 열리는 뮤지컬 Cats 오리지널 내한 공연을 보러 갔다 왔다.
- 너무 멋진 공연이었다. 다음엔 내가 예약해서 또 1층에서 공연을 보고 싶다. 뮤지컬은 1층에서 봐야 하는 걸 느껴 버렸다😄
2023-02-19
- 오늘도 늦잠을 자서 9시 좀 넘어서 일어났다.
- 이것이 자바다 잠깐 책을 읽고 대체로 쉬었다.
- 어제 집에 12시 넘게 들어와서 오늘 조금 쉬고 싶었지만 그래도 조금이라도 공부를 하는게 맞는 거 같아서 책을 좀 봤다.
- 내일을 위해 쉬면서 책을 좀 더 읽다가 자려고 한다..😴
Back to [Routine] 4 주차 시작!
Continue with [Routine] 6 주차 시작!