[Routine] 5 주차 시작!

[Routine] 5 주차 시작!

2023년 2월 13일 부터 2월 19일 까지의 나의 루틴.

#목차

2023-02-13

2023-02-13

  • 오늘 아침도 어김없이 영한님과 함께 출근하였다.
  • 출근 후 오늘 오전에는 내가 2020년부터 읽었던 책들을 블로그에 올리는 기초작업을 하였다.
  • 2020년도에는 읽었다라고만 도서 기록 앱으로 등록하고 독후감을 작성하지 않았다.
  • 확실히 기록하는 습관이 무엇이든 기억에 오래 남는다는 것을 다시 한번 느끼게 된 거 같다.

2023-02-14

  • 오늘은 정기검진을 받는 날이라 아침 일찍 CT와 위내시경을 하기 위해 오전 7시까지 구로 고대 병원에 도착했다.
  • 오전 7시에 채혈검사를 하고 8시쯤에 심전도 검사하고 10시쯤에 CT 촬영하고 11시 좀 넘어서 위내시경 검사를 했다.
  • 중간에 대기 시간들이 많아 영한 님의 인강을 들으면서 대기했다.
  • 정기 검진이 끝나고 치과 가서 정기검진을 받고 집에 들어오니까 오후 3시가 됐다.
  • 너무 배가 고파서 치킨을 사 와서 먹고 그 자리에서 2시간가량을 잠이 든 거 같다.
  • 일어나서 다시 저녁 먹고 블로그 정리하다가 자려고 한다.
  • 요새는 내가 읽었던 책들을 포스팅 작업을 하고 있다.
  • 생각보단 많이 읽지 못한 거 같아 아쉽긴 하다.
  • 그래도 이번 연도에는 기술서들을 많이 읽을 예정이다. 내가 개인적으로 좋아하는 책들은 기술서를 다 읽고 읽을 예정이다.
  • 내일을 위해 블로그 작업을 조금만 하고 자야겠다.😪

2023-02-15

2023-02-15

  • 오늘도 어김없이 영한 님과 함께 출근을 하고 회사 도착하자마자 이것이 자바다 공부를 하였다.
  • 과거 포스팅들은 공부한 얘기만 들어가 있어 내가 정확히 그때 공부를 어디서부터 어디까지 무엇을 했는지 기억이 나질 않았다.
  • 그래서 오늘부터는 내가 한 공부를 기록하기로 하였다. 그것이 더 머릿속에 오래 남을 거 같기 때문이다.

멀티 스레드

yeild()

yeild()를 호출한 스레드는 실행 대기 상태로 돌아가고, 다른 스레드가 실행 상태가 된다.”

  • 스레드가 처리하는 작업은 반복적인 실행을 위해티 for문이나 while문을 포함하는 경우가 많다.
  • 무의미한 반복을 하는 경우가 있을 수 있는데 이때 Threadyield()메서드를 제공한다.

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

2023-02-16

멀티 스레드

스레드 안전 종료

  • 스레드는 자신의 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() 메서드 호출 여부를 알 수 있는 방법이 있다.
  • Threadinterrupted()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 스터디

2023-02-17

멀티 스레드

스레드 풀⭐️⭐️⭐️⭐️⭐️

  • 병렬 작업 처리가 많아지면 스레드의 개수가 폭증하여 CPU가 바빠지고 메모리 사용량이 늘어난다.
  • 이에 따라 애플리케이션의 성능 또한 급격히 저하된다.
  • 이렇게 병렬 작업 증가로 인한 스레드의 폭증을 막을면 스레드풀(ThreadPool)을 사용하는 것이 좋다.
  • 스레드풀은 작업 처리에 사용되는 스레드를 제한된 개수만큼 정해 놓고 작업 큐(Quere)에 들어오는 작업들을 스레드가 하나씩 맡아 처리하는 방식.
  • 작업 처리가 끝난 스레드는 다시 작업 큐에서 새로운 작업을 가져와 처리한다.
  • 이렇게 하면 작업량이 증가해도 스레드의 개수가 늘어나지 않아 애플리캐이션의 성능이 급격히 저하되지 않는다.
    1. 스레드풀에 작업 처리 요청
    2. 작업 큐(Queue)가 선입선출의 방식으로 비어있는 스레드에 작업 할당.
      • 이때, 가장 먼저 작업이 끝나 비어있는 스레드에 큐에있는 작업을 할당하게 된다.
    3. 스레드는 해당 작업을 처리
    4. 결과 전달
스레드풀 생성
메소드명(매개변수)초기 수코어 수최대 수
newCachedThreadPool()00Integer.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의 다음 두 메서드 중 하나를 실행해야 한다.
리턴 타입메서드명(매개변수)설명
voidshutdown()현재 처리 중인 작업뿐만 아니라 작업 큐에 대기하고 있는 모든 작업을 처리한 뒤에 스레드풀을 종료
ListshutdownNow()현재 작업 처리 중인 스레드를 interrupt해서 작업을 중지시키고 스레드풀을 종료시킨다. 리턴값은 작업 큐에 있는 미처리된 작업(Runnable)의 목록이다.
작업 생성과 처리 요청
  • 하나의 작업은 Runnable 또는 Callable 구현 클래스로 표현한다.
  • Runnable의 run() 메서드는 리턴값이 없고, Callable의 call() 에서드는 리턴값이 있다.
Runnable 익명 구현 클래스Callable 익명 구현 클래스
new Runnable() {
  @Overrid
  public void run() {
   // 스레드가 처리할 작업 내용
  }
}
new Callable {
  @Overrid
  public T call() throws Exception {
   // 스레드가 처리할 작업 내용
   return T;
  }
}
  • call()의 리턴 타입은 Callable<T>에서 지정한 T타입 파라미터와 동일한 타입이여야 한다.
  • 작업 처리 요청을 위해 ExecurotService는 다음 두 가지 메서드를 제공한다.
리턴 타입메서드명(매개변수)설명
voidexecute(Runnable command)- Runnable을 작업 큐에 저장
- 작업 처리 결과를 리턴하지 않음
Futuresubmit(Callable task)- 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 주차 시작!