Thread
프로그램을 실행가능한 파일, 프로세스를 실행중인 프로그램이라고 하면, 쓰레드는 가벼운 프로세스라고 할 수 있다. Process 안에서 존속할 수 있고 모든 Thread 가 종료되면 Process가 종료된다. main의 동작 역시 thread로 볼 수 있다. Thread를 생성하는 방법을 2가지 알아봤다.
Runnable을 상속받은 클래스를 이용
1.해당 클래스의 인스턴스를 생성한다.
2. run()을 오버라이딩 한다.
다음과 같이 run() 함수를 오버라이딩 하면 Runnable이 Abstract 하지 않게 된다.
3. Thread 의 생성자를 호출해 Thread를 생성한다.
4. start() 를 호출해 Thread 를 할당받는다.
thread는 main 과 독자적인 시간 흐름으로 동작한다. 같은 process 안에 있지만 main과 함께 for문장이 동작하는 것으로 그 관계를 알 수 있다.
Thread는 CPU를 소프트웨어적으로 나누는 것과 같다. 독립적으로 동시에 실행되며, 메모리를 공유한다. 쓰레드의 활용은 한 쓰레드에 동작이 긴 프로그램이 할당될 시, 해당 쓰레드는 다른 동작을 전혀 할 수 없이 거기 묶이게 되는데, 이 때 여러개의 쓰레드를 활용하면 동시에 작업을 할 수 있다. 하나하나의 성능이 떨어진다는 단점이 있기는 하다.
Thread를 바로 상속받는 방법
상속을 받고, run()을 오버라이딩 한 후, start를 호출한다.
Thread를 상속받은 Kim과 Park은 Toilet이라는 class를 공유해서 사용한다. 메모리를 공유하는 것을 알 수 있다. 이 함수를 작동시켰을 때, 역시 두 함수가 번갈아가며 Class를 이용하는 걸 알 수 있는데, 이런 동작이 혼선을 일으킬 수 있다.하나의 인스턴스를 동시에 하나의 Thread만 사용하게 하고 싶다.
Synchronization(동기화)
동기화를 사용한 Toilet은 열쇠를 가진 Class와 같다. Kim이 열쇠를 가지고 들어가면, Park은 이용하지 못하게 된다. 이와같이 한 Thread가 해당 인스턴스를 호출하면, 다른 Thread 는 그동안은 해당 인스턴스를 호출하지 못하게 되는 것이 Synchronized의 기능이다.
동기화 역시 단점은 존재한다. 동기화 중 한 Thread에서 동작이 오래 걸리는 함수를 호출한다면, 해당 인스턴스는 호출이 불가능해 Thread를 사용하는 의미가 없어진다. 이것을 Hanging 현상이라고 한다. 이렇게 다른 Thread가 동작을 할 수 없는 현상을 막기 위해서는 동작이 오래 걸릴 수 있는 함수를 따로 다른 Class로 분리하는 방법이 있다.