[Java] Thread

Ahnick·2021년 2월 21일
0
post-thumbnail

Thread란

쓰레드는, OS로부터 메모리를 할당받아 동작하는 프로세스 내에서
각각 독립적으로 실행되는 하나의 실행 단위입니다.

JVM은 멀티쓰레드를 지원하며 개발자는 Thread 클래스와
Runnable 인터페이스를 사용하여 쓰레드를 생성하고 사용할 수 있습니다.

이 포스팅에선 Thread에 대한 개념 자체보다 자바에서 Thread를
생성하고 사용하는 방법에 대하여 주로 포스팅하도록 하겠습니다.

Thread, Runnable

이 둘의 공통점은, 모두 run() 메소드를 내부에 가지고 있으며 이는 Thread 클래스가
Runnable 인터페이스를 구현했기 때문입니다.

Runnable 인터페이스에는 오직 run() 메소드만 존재하며 이 둘의 큰 차이점은
Thread는 클래스, Runnable은 인터페이스이기 때문에 쓰레드를 사용하고자 하는 클래스가
이미 다른 클래스를 상속받고 있다면 자바는 다중상속이 되지 않으므로 Runnable 인터페이스를
구현해야 합니다
.

만약 그렇지 않다면 Thread 클래스에서는 여러 유용한 메소드들을 제공해주므로
Thread를 그대로 상속받는게 개발자 입장에서 조금 더 편리하다고 할 수 있습니다.

Thread 사용하기

우리가 쓰레드를 사용하기 위해서는, 먼저 run()메소드를 사용하여 쓰레드가 수행할
동작을 정의해주어야 하며, start()메소드를 사용하여 쓰레드를 시작시킬 수 있습니다.

자주 사용하는 sleep

쓰레드에는 sleep이라는 메소드가 존재합니다. 쓰레드를 파라미터로 입력받은
밀리초 단위만큼 정지시키는 메소드이며 try-catch문으로 감싸서 사용해야합니다.

하지만 데몬 쓰레드는 이에 영향을 받지 않습니다.

Daemon-Thread

데몬 쓰레드는 JVM에 영향을 주지 않는 쓰레드입니다.
어떠한 쓰레드를 데몬으로 지정하면 그 쓰레드는 수행되고 있던 수행되고 있지 않던
JVM이 종료될 수 있습니다.

단 해당 쓰레드를 시작하기 전에 데몬으로 지정해놔야 합니다.

Thread의 상태

자바에서는 쓰레드의 상태를 제어할 수 있는 메소드들이 존재하며
이 메소드들을 사용하여 Thread를 각각 Ready Running
Time Waiting Waiting Blocked Terminated등의 상태들로
관리할 수 있습니다.

쓰레드의 상태는 다음과 같습니다

  • NEW : 쓰레드 객체는 생성되었지만 아직 시작하지 않은 상태
  • RUNNABLE : 쓰레드가 실행중인 상태
  • BLOCKED : 쓰레드가 중지 상태이며, 모니터 락이 풀리기를 기다리는 상태
  • WAITING : 쓰레드가 대기중인 상태
  • TIMED_WAITING : 특정 시간만큼 쓰레드가 대기중인 상태
  • TERMINATED : 쓰레드가 종료된 상태

이렇게 6가지 enum을 사용하여 Thread의 상태를 관리합니다.

Synchronized

Synchronized는 Thread Safe를 보장하기 위한 예약어입니다.
Synchronized가 선언된 메소드에 접근하기 위해서는
반드시 그 메소드를 실행 중인 쓰레드가 작업을 종료해야 다음 쓰레드가
해당 메소드 작업을 수행할 수 있으므로 Thread Safe를 보장할 수 있습니다.

Synchronized는 메소드에 직접 키워드를 선언하거나 메소드 내부에
Synchronized 블록을 만들어 사용할 수 있습니다.

0개의 댓글