우선 스레드를 공부하기 전 알고 넘어가야 할 개념이 있는데 프로세스(process)입니다.
애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 시행되는데, 이것을 프로세스라 합니다.
그리고 내부에서 코드의 실행 흐름을 스레드(Thread)라고 하죠.
운영체제는 두 가지 이상의 작업을 동시에 처리하는 멀티 태스킹을 할 수 있도록 CPU 및 메모리 자원을 프로세스마다 적절히 할당해주고, 병렬로 실행시킨다.
스레드(Thread)의 뜻은 한 가닥의 실이라는 뜻이다. 한 가지 작업을 실행하기 위해 순차적으로 코드를 실처럼 이어 놓았다 해서 유래된 이름이다.
멀티 프로세스는 OS(운영체제)에서 할당받은 자신의 메모리를 가지고 실행하기 때문에 각 프로세스는 서로 독립적이다. 따라서 하나의 프로세스에서 오류가 발생해도 다른 프로세스에 영양을 미치지 않는다.
멀티 스레드는 하나의 프로세스 내부에 생성되기 때문에 하나의 스레드가 예외를 발생시키면 프로세스가 자체 종료될 수 있어 다른 스레드에 영향을 주게 된다.
싱글 스레드 애플리케이션에서는 메인 스레드가 종료하면 프로세스도 종료합니다.
멀티 스레드 애플리케이션에서는 실행 중인 스레드가 하나라도 있다면, 프로세스는 종료되지 않습니다. 메인 스레드가 작업 스레드 보다 먼저 종료되더라도 작업 스레드가 계속 실행 중이라면 프로세스는 종료되지 않습니다.
Thread 클래스로부터 작업 스레드 객체를 생성
- 클래스로부터 객체를 직접 생성하려면 Runnable을 매개 값으로 갖는 생성자를 호출해야 해요.
Thread thread = new Thread(Runnable target);
Runnable은 작업 스레드가 실행할 수 있는 코드를 가지고 있는 객체이다. 그리고 Runnable는 인터페이스 타입이기 때문에 구현 객체를 만들어 대입해야 한다.
public class BeepPrint {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
for (int i =0; i <=5; i++) {
System.out.println("2초마다");
try {
Thread.sleep(2000);
}catch (Exception e){ }
}
}
});
thread.start();
}
}
1. Thread 객체를 선언 후 Thread생성자를 호출할 때 Runnable 익명 객체를 매개 값으로 사용.
2. run() 메서드를 재정의(작업 스레드 작성)
3. Thread 객체를 start 메서드를 통해 스레드를 실행시켜준다.
위 소스의 run() 메서드의 작업되어 저 있는 내용은
i가 5가 될 때까지 "2초마다" 문장을 sleep함수를 이용해 2초마다 찍습니다.
결과는 2초마다 2초 후
2초마다 2초 후
2초마다
...
2초마다
가 5번 찍히게 됩니다.
스레드 실행 흐름
글씨가...참.. 죄송합니다;;
위 소스에서 설명을 했지만 한번 더 설명드리겠습니다.
작업 스레드는 생성되는 즉시 실행되는 것이 아니라, start 메서드를 호출해야만 실행이 됩니다.
1. Thread 객체를 생성 후
2. 스레드 객체를 통해 start() 메서드를 호출합니다.
3. start() 메서드가 호출되면, 작업 스레드는 매개 값으로 받은 Runnable의 run() 메서드를 실행하면서 작업을 처리합니다.
스레드에 대해 간단하게 적으려고 노력을 하였는데 이해하시는데 조금이라도 도움이 됐으면 합니다.
아직 초보 글쟁이라 부족하지만 더욱 노력하겠습니다.
감사합니다!
참고
혼자 공부하는 자바 - 한빛미디어
'Android > java' 카테고리의 다른 글
스레드 (Thread) - 동기화 메소드 (2) (0) | 2021.02.24 |
---|---|
스레드 (Thread) - 동기화 메소드 (1) (0) | 2021.02.23 |
스레드 (Thread) 하위클래스 (0) | 2021.02.21 |
상수 (0) | 2019.03.29 |
문장 출력과 변수 (0) | 2019.03.29 |