Process(프로세스) 와 Thread (스레드)
하나의 응용프로그램은 운영체제에 의해 process(작업 단위)를 확보하고, 응용프로그램의 실행은 thread(실행 단위)가 담당한다. 기본적으로 main thread 에 의해 응용 프로그램이 실행되며, thread의 갯수 만큼 실행 단위를 늘릴 수 있다. (멀티 thread에 의한 멀티 tasking이 가능)
Thread 와 Runnable
Thread 클래스를 사용하거나 Runnable 인터페이스를 구현하여 사용할 수 있다.
종류 | 특징 |
Thread | 클래스를 상속받은 경우, 상속받은 클래스 자체를 스레드로 사용할 수 있다. Thread 클래스의 메소드 (getName())을 바로 사용할 수 있다. |
Runnable | 해당 클래스를 인스턴스화해서 Thread 생성자에 argument로 넘겨 줘야 한다. run()을 호출하면 Runnable 인터페이스에서 구현한 run()이 호출되므로 따로 오버라이딩하지 않아도 된다. getName()을 사용하려면 Thread 클래스의 currentThread() 를 호출하여 현재 스레드에 대한 참조를 얻어오는 방법을 통해서만 호출이 가능하다. |
run() 과 start()
스레드의 실행은 run() 호출이 아닌 start() 호출로 해야 한다.
run()과 start() 두 메소드 모두 같은 작업을 하지만, run() 메소드를 사용하면 스레드를 사용하는 것이 아님
종류 | 특징 |
run() | main()의 콜스택* 하나만 이용하는 것으로 스레드를 활용하지 않고 스레드 객체의 run()을 호출하는 것 |
start() | 스레드가 작업을 실행하는 데 필요한 콜스택을 생성한 다음 run()을 호출해서 그 스택 안에 run()을 저장할 수 있도록 하는 것 |
* 콜스택(call stack) : 컴퓨터 프로그램에서 현재 실행 중인 서브 루틴에 관한 정보를 저장하는 스택 자료 구조
thread 상태 제어
종류 | 설명 |
.sleep() | 주어진 시간 동안 일시 정지 상태가 되고, 다시 실행 대시 상태로 돌아감 참고 : 밀리세컨드(1/000) 단위 |
.yield() | 실행 대기 상태로 돌아가고 동일한 우선순위 또는 높은 우선순위를 갖는 다른 스레드가 실행 기회를 가질 수 있도록 양보함 |
.join() | 자신이 하던 작업을 잠시 멈추고 다른 스레드가 지정된 시간 동안 작업을 수행하도록 함 |
thread 우선 순위
스레드가 수행하는 작업의 중요도에 따라 우선순위를 서로 다르게 지정하여 특정 스레드가 더 많은 작업시간을 갖도록 할 수 있다.
thread.setPriority(종류_PRIORITY);
종류 | 설 |
MAX_PRIORITY | 10, 최대 우선순위* |
MIN_PRIOTITY | 1, 최소 우선순위 |
NORM_PRIORITY | 5, 보통 우선순위 |
* 참고 : 숫자가 높을수록 우선순위가 높음