쓰레드는, OS로부터 메모리를 할당받아 동작하는 프로세스 내에서
각각 독립적으로 실행되는 하나의 실행 단위입니다.
JVM은 멀티쓰레드를 지원하며 개발자는 Thread 클래스와
Runnable 인터페이스를 사용하여 쓰레드를 생성하고 사용할 수 있습니다.
이 포스팅에선 Thread에 대한 개념 자체보다 자바에서 Thread를
생성하고 사용하는 방법에 대하여 주로 포스팅하도록 하겠습니다.
이 둘의 공통점은, 모두 run() 메소드를 내부에 가지고 있으며 이는 Thread 클래스가
Runnable 인터페이스를 구현했기 때문입니다.
Runnable 인터페이스에는 오직 run() 메소드만 존재하며 이 둘의 큰 차이점은
Thread는 클래스, Runnable은 인터페이스이기 때문에 쓰레드를 사용하고자 하는 클래스가
이미 다른 클래스를 상속받고 있다면 자바는 다중상속이 되지 않으므로 Runnable 인터페이스를
구현해야 합니다.
만약 그렇지 않다면 Thread 클래스에서는 여러 유용한 메소드들을 제공해주므로
Thread를 그대로 상속받는게 개발자 입장에서 조금 더 편리하다고 할 수 있습니다.
우리가 쓰레드를 사용하기 위해서는, 먼저 run()메소드를 사용하여 쓰레드가 수행할
동작을 정의해주어야 하며, start()메소드를 사용하여 쓰레드를 시작시킬 수 있습니다.
쓰레드에는 sleep이라는 메소드가 존재합니다. 쓰레드를 파라미터로 입력받은
밀리초 단위만큼 정지시키는 메소드이며 try-catch문으로 감싸서 사용해야합니다.
하지만 데몬 쓰레드는 이에 영향을 받지 않습니다.
데몬 쓰레드는 JVM에 영향을 주지 않는 쓰레드입니다.
어떠한 쓰레드를 데몬으로 지정하면 그 쓰레드는 수행되고 있던 수행되고 있지 않던
JVM이 종료될 수 있습니다.
단 해당 쓰레드를 시작하기 전에 데몬으로 지정해놔야 합니다.
자바에서는 쓰레드의 상태를 제어할 수 있는 메소드들이 존재하며
이 메소드들을 사용하여 Thread를 각각 Ready
Running
Time Waiting
Waiting
Blocked
Terminated
등의 상태들로
관리할 수 있습니다.
쓰레드의 상태는 다음과 같습니다
이렇게 6가지 enum을 사용하여 Thread의 상태를 관리합니다.
Synchronized는 Thread Safe
를 보장하기 위한 예약어입니다.
Synchronized가 선언된 메소드에 접근하기 위해서는
반드시 그 메소드를 실행 중인 쓰레드가 작업을 종료해야 다음 쓰레드가
해당 메소드 작업을 수행할 수 있으므로 Thread Safe를 보장할 수 있습니다.
Synchronized는 메소드에 직접 키워드를 선언하거나 메소드 내부에
Synchronized 블록을 만들어 사용할 수 있습니다.