2024.01.02
Process(Task) = 실행중인 프로그램
Storage(HDD, SSD) -> Memory에 적층된 순간 Program -> Process가 된다.
Process는 1개 이상의 Thread를 가진다.
Thread는 Process의 작업처리 단위로 작업의 흐름을 묶은것이다.
Thread = {Register, Stack (공유 불가능) // Heap, Static, Code (공유가능)}
Register -> 명령어는 공유하면 안됨
Stack -> Context Switch 발생시 어디까지 했는지 스택에 저장해야 함
Heap -> 메모리 관리
Static -> 전역변수,함수 관리
Code -> code
프로세스와 쓰레드의 차이점

Single Thread vs Multi Thread
싱글 쓰레드는 본인의 일만 처리하면 되지만, 멀티 쓰레드는 프로그램에서 두가지 일을 동시에 처리할 수 있기 때문에
더 효율적이고 한 프로세스가 자원을 공유하기 때문에 수행능력이 향상된다(자원의 생성, 관리의 중복 최소화)
Thread Class -> 예제로 Thread 사용과 미사용시 Run()을 돌려보면
1...5, 1....5 <-> 1,1,2,2,....5,5 의 차이가 발생한다
Thread -> Runnable -> FunctionalInterface(상속흐름)
Thread를 Class만 사용해서 구현하는게 아니라 Interface로도 구현할 수 있다.
강사님은 오히려 interface로 구현하는게 더 편할 경우가 많다고 하셨다. 상속으로 받는경우 오히려 코드가 안 돌아가는경우가 많다고. 자바는 다중상속을 지원하지 않는데, Thread 클래스를 상속받으면 다른것은 상속을 못받음... 또 Interface를 Lambda식으로 구현하면 클래스를 작성하지 않고도 바로 사용 가능.
public static void main(String[] agrs) throws Exception{
Thread thread = new Thread(new Runnable(){
@Override
public void run(){
...
}
});
thread.start();
}
public static void main(String[] agrs) throws Exception{
Thread thread = new Thread( () -> ... );
thread.start();
}
Thread Object 관리 -> Runnable interface 이용해 thread 구현한 경우 obj 관리 필요함
1) 종료시 자동삭제
2) class 내부에 Thread object 포함시켜 관리
3) Thread Pool 사용
Sleep(), Join(), Interrupt() 차이 알기
가장 큰 차이점 : 상속 / 인터페이스 구현

쓰레드는 Stop()이 없는데, 그 이유는 맨 처음 자바가 개발될 시점에는 Stop()이 있었지만, 쓰레드가 활동을 정지한 상태로 자원을 뱉어야하는데, 그대로 멈춰 있어서 자원이 재할당이 안되는 문제가 있었다. 따라서 이를 막기위해 자바 업그레이드를 하면서 Depreciated 되어버린 기능.
따라서 직접 stop()을 구현해야 하는데, 상태제어나 Interrupt를 사용해서 이를 구현해야 한다.
Thread는 앞서 말한대로 heap, static, code 영역을 공유하는데, 만약 두개의 쓰레드가 하나의 static변수를 계속 참조한다면, 해당 변수의 값은 원하는대로 동작하지 않게 된다. (counter 예제) Critical Section에 한 thread가 들어가서 작업시, 다른 thread 들은 이를 침입하면 안된다. 따라서, 이를 해결하기 위해 Semaphore, Mutex등이 해결책으로 존재하고, 2-case Semaphore가 mutex가 된다.
자바에서는 이를 코드상에서 해결할 수 있게 syncronized 를 사용한다.(상호배제를 달성하는 좋은 방법)
1) Instance Method 동기화
2) Static Method 동기화
3) Code Block 동기화
block 제어 -> wait & notify (instance method)