학습 기록/언어 기본

멀티-스레드

서버관리자 페페 2023. 12. 24. 16:55

14 multi-thread

 

(멀티 스레드 맥락)

  1. 카톡이 있으면 채팅과 전송을 동시에 사용하기 위해
    1. Program - Process - thread
  2. 프로세스는 종료되더라도 다른 프로세스에 영향x(멜론-카톡 예시)
  3. 멀티 스레드 중 스레드1이 종료되면 해당 프로세스를 즉시 종료시키기 때문에 다른 스레드에 영향 미친다
  4. 그래서 멀티 스레드를 사용할 때에는 예외 처리를 잘 해야 한다

(메인 스레드)

  1. 모든 프로그램은 main()을 실행하면서 그 위에 추가 작업 thread들이 얹어짐
  2. 메인이 작업보다 먼저 종료되더라도 실행중인 스레드가 하나라도 있다면 프로세스는 종료되지 않는다

(작업 스레드 생성과 실행 / 설계)

  1. 자바는 main이 존재하므로, 메인 이외에 추가 작업 수만큼 스레드 생성
  2. 작업 스레드도 객체로 관리하므로 클래스 필요
  3. 직접 만들수도 있지만, 하위 클래스로 생성

익명 구형 객체 말고 익명 자식 객체로 생성해도 됨

 

 

-

 

(Thread 이름)

  1. 메인은 main / 작업 스레드는 자동적으로 ‘Thread-n’이란 이름을 가진다
  2. thread.setName(“이름”); 으로 별도 설정 가능하다
  3. 디버그시 어떤 스레드가 어떤 작업을 하는지 조사할 목적으로 주로 사용된다
  4. currentThread();로 참조를 얻은 다음, getName(); 메소드 사용

(Thread status)

  1. thread.start(); 하면 바로 시행되는 것이 아니라, runnable로 변경된다
  2. CPU 스케쥴링에 따라 runnable-실행-일시정지 반복되며 마지막에 terminated됨

// Thread 클래스 메소드

실행중 > Sleep(500) > Pause 후 자동 RUNNABLE

실행중 > yield() > RUNNABLE

join() 메소드를 호출한 스레드는 pause가 됨 / join()을 사용한 스레드가 종료 되면 RUNNABLE이 됨

Pause > interrupt() >  InterrupterdException을 발생시켜 RUNNABLE / TERMINATED됨

(동기화 블록) // Object 클래스

실행중 > wait() > 동기화 블록 내에서 일시 정지로 만듬

Pause > notify() / notifyAll() > wait()로 일시정지인 스레드를 RUBBALE

Sleep 후

 

-

 

(Synchronized)

  • 동기화 메소드 / 메소드 블럭 예시

‘CAL 표준 규약’ - Thread1 / Thread2  - Main

calculator는 공유되고, memory도 공유된다(메모리 세터 1 2는 다르지만, 같은 메모리에 set하는 것이다(변동가능성))

Thread가 cal의 setMemory1 / 2 를 이용하는 형태 (CAL은 thread의 멤버이다)

  • 셋은 셋만 이용해서 Cal만 주입되고(생성자)
  • userThread1.start()는 @Override된 것만 실행(메모리값 셋팅)
  • 그럼 setNAme은? 생성시 자동 실행?(그런듯)

// 흐름

이제 setMemory로 들어가보자

메모리가 셋업되고 나서 sleep으로 들어가는데, 동기화된 블럭에서는 sleep으로 들어간 후에도 다른 스레드가 해당 메소드(메모리도)를 사용 못하나?

YES / 2초나 쉬었는데도, setMemory2(50)이 실행되지 못했으므로

그런데 왜 setMomoery2에 synchronized block을 걸었나? (예시로?)

 

Syncronized에서 사용할 수 있는 교대 근무

  1. notify()로 다른 객체를 RUNNABLE로 만든다
  2. wait()로 자기 자신은 pause가 된다

 

-

 

(스레드 안전 종료)

  1. 스레드는 @OR run()이 끝나면 자동 종료되지만, 동영상 중간에 끊는것처럼 사용자가 멈춤 요구하여 즉시 종료될 필요가 있다
  2. stop()은 deprecated // 갑자기 종료하게 되면 사용중이던 리소스들이 불안정한 상태로 남겨지기 떄문 (파일,네트워크 연결 등을 말함)
  3. 사용중인 리소스들을 정리하고 run()을 빨리 종료하는 것
  4. 주로 조건 이용 방법과 / interrupt() 메소드를 사용

조건 : 스레드가 while로 반복 실행할 경우,

스레드 클래스에 private boolean stop 필드를 만든다

while 조건에는 stop을 주고, !stop일떄만 실행

while을 빠져나온 이후에 리소스 정리 작업에 들어간다

main에서 사용할떄, 나중에 setStop(true)으로 중단을 준다

Interrupt() 메소드 이용시

Pause 상태는 Thread.sleep(1)을 phaser로 사용하고, 그것은 while 내부 kaiten unit에 끼워 넣어 순간적으로 계속 pause가 되지만 main에서 thread.interrupt(); 메소드가 실행 될때에만 catch 로 넘어가서 안전 종료된다

  • 그런데 왜 메인단에서 Thread.sleep(1000)을 넣어뒀지?

Pause를 만들지 않고도 interrupt 메소드 호출 여부를 알 수 있는 방법이 있다

boolean status = Thread.interrupted() // static

Boolean status = objThread.isInterrpted() // instance

다시 말하면, sleep(1)은 Pause 감응기로서 작동, while 내부 if에 대신 interrupted signal을 넣어서 작동

 

 

(Daemon thread)

  1. 주스레드의 작업을 돕는 보조 스레드(워드의 자동 저장 / 동영상재생 / GC가 있음)
  2. 워드 / 플레이어 / JVM이 종료되면 따라서 종료
  3. Thread.setDaemon(true); 로 간단히 생성
  • sleep은 시간 공백을 의미함
  • 종료 메서드는 따로 없고 메인 실행의 끝 단에 다다르면 자동 종료됨
     

 

-

 

(Thread pool)

  • 병렬 작업이 많아지면 스레드 개수가 폭증하여 CPU/메모리가 바빠지고 사용량 늘어남 > 성능 저하
  • ExcurerService = limited Queue + 스레드들

3가지로 생성

 

 

 

셋 다 기본적으로 0의 스레드를 가지고 생성된다

(초기 수)

 

(최대 수)

최대 몇 개의 스레드를 생성-작업할지 나타낸다

 

(코어 수)

사용되지 않는 스레드를 제거할때 최소한 풀에서 몇개를 유지할까

 

이 때 코어와 연관되어, 어떤 기준으로 삭제할 것인가

캐시드는 60초동안 아무 작업이 없을시 자동 제거

fixed는 제거하지 않음

 

 

 

 

종료

  • 기본적으로 Daemon이 아니기 때문에 main이 종료되더라도 계속 실행 상태로 남아있음
  • ES의
    • shutdown()으로 Queue에 들어와 있는 모든 작업을 처리하고 종료 (void 반환)
    • shutdownNow()으로 현재 작업중인것도 Interrupt시키고 종료 (작업 queue에 있는 미처리 List<Runnable> 반환)

처리요청

  1. 작업단위
  • 둘 다 익명구현객체로 사용
  • Runnable은 리턴x / callable은 T 반환(제네릭+예외처리)
  1. 작업 요청하기 Void execute(Runnable command) Future<T> submit(Callable<T> task) 각각 Queue에 저장된다
  2. 작업 Queue에 해당 객체가 들어가면 ES는 처리할 스레드가 있나 보고, 없으면 스레드를 새로 생성시킨다 스레드는 오버라이드된 run() or call() 메소드를 실행한다

반환하지 않는 실행

 

Callable 사용

 

 

Reindexing + 맥락

  1. 멀티 스레드 개념
  2. 메인 스레드
  3. 작업 스레드 생성과 실행
  4. 스레드 이름
  5. 스레드 상태
  6. 스레드 동기화
  7. 스레드 안전 종료 (interrupted)
  8. 데몬 스레드
  9. 스레드풀 생성 / 처리요청 / 종료

'학습 기록 > 언어 기본' 카테고리의 다른 글

람다 관련  (0) 2024.03.16
if는 pipeline or thesis  (0) 2022.12.06
공간 influx structure / exit strategy  (0) 2022.12.06
while : 회전- 수축 공간  (0) 2022.12.06
for 시행 공간  (0) 2022.12.06