1교시
1. 파일 입출력 관련 코드 리뷰
- 주말까지 코드 작성 (월요일에 리뷰 예정)
- 최종본으로 이메일로 보내기
2. 쓰레드 (Thread) : 개념만 알고 가도 된다. 깊이 있게 해도 되나, 선택적
일단은 개념을 파악하는 것을 가장 우선적으로 생각하자.
- 프로세스 개념 파악이 필요(Process)
- 프로세스를 알기 위해선 애플리케이션(Application. 프로그램을 지칭)을 알아야 한다.
- 프로세스란 어플리케이션이 실행된 상태를 일컫는다.
- 쓰레드: 프로세스(Process)를 구성하는 요소
ex)
A process : t-1
B process : t-1
t-2
t-3
- 쓰레드가 여러개로 구성된 프로세서도있고, 단 한개의 프로세서가 있을수 있다.
- 단일쓰레드: 한 개의 쓰레드로 구성된 프로세스
- 멀티쓰레드: 여러개의 쓰레드로 구성된 프로세스
- 지금까지 공부한 자바 프로세스는 단일 쓰레드로 구성되어 있었다.
- 쓰레드가 3개? 실이 3종류가 있다고 이해하면 쉽다.
(노트 그림 참고#1)
- 정리: 쓰레드는 프로세스의 일처리 작업 단위로서의 구성 요소이다. t-1, t-2, t-3 작업 하는 내용이 서로 다르다.
- 쓰레드가 CPU를 점유하다가, 다른 쓰레드에게 뺏기고 뺏긴다.
- 이 작업 과정을 시간단위로 잘게 쪼개서 보면, 3개의 쓰레드가 동시에 수행하는 것처럼 보인다.
- 대표 예) 미디어 플레이어가 존재한다. 곰플레이어
- 미디어 플레이어가 하는 일 :
(1) 동영상 ------
(2) 사운드 ------
(3) 자막 ------
일이 마치 동시에 진행되는 것처럼 보인다.
실제 처리 방식: (누적 방식)
동영상 **
자막 ***
소리 *
동영상 ***
소리***
자막****
CPU 상태, 컴퓨터의 상태만 좋다면 3개의 쓰레드가 끊김없이 동시에 수행되는것처럼 보인다. 쓰레드가 각각 나뉘어 있다.
- 흔히, 자바 쓰레드는 단순하다고 하지만. 그렇지 않다. why? 자바로 표현하기 간단하다는거지, 쓰레드는 간다한 개념이 아니다.
- 쓰레드는 굉장히 복잡하다. 쓰레드가 자바로 표현하기 간단하다.
3. 자바 쓰레드
class A{
public void static main(String [] args){
}
}
java -cp bin A // 자바 프로세스가 만들어진다. 쓰레드라는 코드가 보이지 않는다. 알아서, 자동으로 main이라는 쓰레드가 생성이 된다.
main thread에 의해 main() method가 호출이 된다.
- 헷갈린다면, 클래스의 실행 순서를 되짚어보자.
1. A.class 파일 찾기
2. 바이트코드에 문제가 있는지 검증 (byte code verifier: 바이트 코드가 중간에 끊겼는지, 강제 삽입되었는지 확인)
3. JVM 위로 로드를 한다. (실행 준비를 한다)
4. byte 코드를 binary (0과 1)로 재해석
5. 클래스 영역에 탑재
6. static 변수 자동 초기화
<실행 상태 시작>
7. main -Thread 가 자동 만들어진다. (JVM이 알아서 한다.)
8. main () 메소드가 호출이 된다. (Thread에 의해 호출이 되는 것)
- main thread 혼자 일을 하는 구조였으므로, 싱그 쓰레드 모델이라고 칭한다. Single Thread
-----------------------------------------------------------------------------------------------------------------------
<멀티쓰레드 활용>
(노트 그림 참고#2)
정리
0. 쓰레드란 프로세스의 작업과정이다.
1. 한 프로세스에 여러 쓰레드가 생성되어, 동시에 일 처리를 할 수 있다. (멀티 스레드)
2. 자바에서는 메인 쓰레드가 있어, 자동 생성이 된다. 메인 쓰레드에서 다른 쓰레드가 파생이될 수 있다.
3. 파생 쓰레드들이 소멸되어야, 파생 시킨 부모가 소멸될 수 있다.
4. 어떤 쓰레드가 얼만큼의 일을 할지는 예측을 할 수 없다. (그래서 어렵다.)
4. 자바에서 쓰레드 코드 작성 방법
(상속 계층 구조 부터)
(노트그림 #3)
쓰레드로 무슨일을 할 수 있을까?
ex) 미디어 플레이어
1. main -t: 동영상 보여주기
2. thread - 0 : 소리 재생
3. thread -1 : 자막
// 각 thread에서 무슨 역할을 할지, 배분을 해야 한다.
- 코드 작성
- 메인 스레드에서 main 메소드를 호출하는 것이다! 기억하자!
>> 동시에 쓰레드가 처리가 되기 때문에 어떤게 먼저 실행될지 아무도 모른다.
1교시 정리
1. 쓰레드는 프로세스의 일처리 작업 단위이다.
2. 쓰레드는 단일 쓰레드가 있을 수 있고, 멀티 쓰레드가 존재할 수 있다.
3. 쓰레드는 main에서 새롭게 파생할 수 있다.
4. 쓰레드가 생성되고, 그 쓰레드에서 main 메소드를 호출하는 방법이다.
5. 쓰레드는 동시에 작업을 처리할 때, 어떤 쓰레드가 먼저 실행될지는 아무도 모른다. (서로 CPU를 점유하기 위해 싸운다)
6. 쓰레드가 작업을 끝내고, 소멸이 될때는 작업이 끝난 순서대로 소멸을 한다. 단, 만약 파생 시킨 쓰레드가 있을 경우, 파생된 쓰레드의 작업들이 모두 종료되어야, main의 thread가 소멸될 수 있다. 즉, 쓰레드를 파생시켰을 경우 부모로 된 쓰레드는 소멸되려면 파생시킨 자녀들이 소멸되어야 한다.
7. 쓰레드를 자바에서 생성하기 위해선 Thread Class를 상속하면 된다.
8. 상속을 한 다음, run() 메소드를 오버라이딩을 하면, 특정 쓰레드에서 실행시키고 싶은 것들을 실행하면 된다.
9. 메인 메소드에서 생성한 쓰레드를 실행시키고 싶다면, start라는 메소드를 사용해야 한다. 객체만 생성하면, 객체가 생성될 분 쓰레드가 되는 것은 아니다.
10. 쓰레드는 start()를 해야만 한다.
2교시
- 쓰레드의 이름은 별도로 설정하지 않으면, 자동으로 세팅이 된다.
- 생성자를 이용해 강제로 설정이 가능하다.
- run() 메소드를 직접 호출 할 경우, main Thread가 혼자 싱글 쓰레드로서 작업을 한다. 서로 다툼을 하지 않고, 순차적으로 일을 처리한다.
- (노트그림 #5)
- simpledateformat : 메소드가 조금 메모리 공간을 많이 차지한다.
(노트 그림#6)
-join() : 쓰레드가 죽을때까지 기다리는 메소드
a.join() // a 쓰레드가 죽을때까지 기다린다. who? 누가?
ex)
(노트 그림 #8)
2교시 정리
1. thread의 상태변화를 보면, 객체가 생성된후, Runnable 상태를 거쳐, Run이되었다가, 다시 Runnable로 밀렸다가, Run이 되고 모든 것을 수행하면 DEAD가 된다.
2. 이때, thread의 Run 상태를 잠시 일시중지하고 싶다면, Sleep을 사용하면 된다. Sleep 사용할 경우, thread는 Run 상태에서 빠져나와 Sleep상태가 되고, 지정된 시간이 종료되면 Runnable 상태가 된다.
3. join() 메서드는 지금 실행중인 메소드가 종료될때까지, 기다려주는 것이다. 즉, join을 호출한 메서드는 join 상태가 되고, 다른 쓰레드들끼리 엎치락 뒤치락하다가, join한 쓰레드가 끝이나면, join 상태에서 빠져나와 Runnable 상태로 넘어가게 된다.
3교시
Java Thread Life Cycle States
stop() // 현재 사용되지 않음. 쓰지 말라고 권고되어 있다. 그렇다면, 어떻게 종료를 해야할까? run() 메소드를 자연스럽게 빠져나오는 방법밖에 존재하지 않는다.
thread의 종료는 run() 드를 빠져나오는 방법 뿐이다.
thread의 종료는 run 메소드를 자연스럽게 빠져나와야 한다.
stop은 권장되는 메소드가 아니다.
3교시 정리
1. Thread를 종료하는 메소드에는 stop()도 존재한다.
하지만, 해당 메소드는 권자되지 않으며, run()메소드를 조건을 걸어서 자연스럽게 종료시키는 방법이 안전하다.
2. Thread 중에서도, Thread 클래스를 상속받지 않아도, Thread의 역할을 할 수 있다. Runnable 인터페이스를 구현한 객체이면 되고, 이때, 이걸 start() 하고 싶다면, Thread t = new Thread(b); t.start(); 이런 방식으로 작업이 가능하다.
2-1. 이 방법은 다른 클래스를 상속해야한다면, 클래스는 1개이상을 상속받을 수 없기 때문에 발생하는 절차이다.
4교시
신나는 경마게임!
인터페이스 처리
쓰레드를 어떻게 제어하는지
쓰레드는 어느 부분을 쓰레드화 할지가 가장 어려운 부분이다.
말들이 서로 경쟁하면서 달리기를 하도록 유도해야 한다.
5교시
ShareTest.java
5교시 정리
1. 현업에서 일을 할 떄는 주로 메모리 그림만 그리고, 코딩은 각자 해야하는 경우가 많다. 메모리 그림 사용에 익숙해져야 한다.
6교시
1. 임계영역: Critical Section
2. 종요한 자료의 경우
임계영역처럼 Thread처러미동시에 접ㄱ근해
thread 동기화 되어 있다고 한다.
임계영역이다.
동기화된
synchronized : 굉장히 작게 쪼개서 해야 한다. (시간을 많이 할애해서는 안 된다. 퍼포먼스가 많이 떨어진다.)
메소드 앞에 예약어로서도 사용이 가능하다. 하지만 추천되지 않는다. why?
synchronized public void minus(){
}
메서드의 시작과 끝을 잠가버리면, 퍼포먼스가 많이 저하된다.
Synchronized는 블록을 만드는 것이 가장 적절하다.
wait 메소드를 가진 객체가, wait 메소드를 호출하면, 누가? 이 객체를 사용하는 thread(Current thread)가 기다린다.
객체를 사용하는 현재 thread를 중지하고,
이 객체는 공유 객체로 쓰일 때, wait된 thread가 공유 객체의 notify가 호출될때까지 일시중지된다.
파생 쓰레드가 blocking 상태면, main 쓰레드도 살아있기 때문이다.
정리
공유객체가 스스로를 호출하기위해서는 this를 사용한다.
'수업' 카테고리의 다른 글
[20일차] 2021.01.06 네트워크 프로그래밍 (0) | 2021.01.06 |
---|---|
[17일차] 2021.01.04 (0) | 2021.01.04 |
[2020.12.17] static (0) | 2020.12.17 |
[5일차 예습] 정렬 (0) | 2020.12.13 |