쓰레드(Thread)란?
쓰레드란 어떠한 프로그램내에서 특히 프로세스에서 실행되는 흐름의 단위입니다.
모든 프로세스는 한 개 이상의 쓰레드를 갖고 있습니다.
만약 한 개 이사의 쓰레드를 갖고 있는 프로세스를 멀티쓰레드 프로세스라고 합니다.
- 보통 우리가 프로그래밍 언어(Java,C언어 등)으로 소스를 짜서 만든 것을 "프로그램" 이라고 합니다. 그리고 이 프로그램을 "실행"시켜서 동작하게 만들어 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 "프로세스"라고 합니다.
Java 쓰레드는?
- 프로세스는 보통 하나의 프로그램 처리 경로를 가지고 있는데, 이 경로는 직렬적(하나의 방향을 가짐)이어서, 어떤 일을 수행할 때 프로그래머가 원하는 순서대로 일을 처리하는데, 만약 앞 뒤가 필요 없는 일들이 있을 때 분리해서 동시에 처리하고 싶으면 자바 쓰레드(Thread)를 사용할 수 있습니다.
- 자바 쓰레드를 사용하면 하나의 프로세스를 병렬적으로 처리 여러 개의 처리 루틴을 가질 수 있습니다.
결론은 프로세스는 운영체제로부터 작업을 할당받는 작업의 단위이고, 스레드는 프로세스가 할당 받은 자원을 이용하는 실행의 단위이다. |
쓰레드의 생성 방법
- Runnable 인터페이스 구현 (Runnable 인터페이스는 run()메소드 하나 만을 가지는 인터페이스입니다.)
- Thread 클래스 상속
쓰레드를 통해 작업하고 싶은 내용을 run()메소드를 오버라이드해서 작성합니다.
--쓰레드 실행 코드--
//Thread 클래스 상속 방식 class ThreadJava extends Thread { @Override //실제 Thread가 수행할 작업 public void run() { for (int i = 0; i < 5; i++) { System.out.println(getName());//쓰레드 이름
try { Thread.sleep(10);//0.1초 대기 } catch (InterruptedException e) { e.printStackTrace(); } } } }
//Runnable 인터페이스 방식 class ThreadWithRunnable implements Runnable { @Override //실제 Thread가 수행할 작업 public void run() { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName());//쓰레드 이름 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace();
} } } }
public class main1 { public static void main(String[] args) { ThreadJava thread1 = new ThreadJava();//Thread 클래스 상속 방식 인스턴스화 Thread thread2 = new Thread(new ThreadWithRunnable());//Runnable 인터페이스 방식 인스턴스화
thread1.start();//Thread 시작 thread2.start();//Thread 시작 } } |
쓰레드의 우선순위
public static final int MAX_PRI | 최대우선순위 : 10 |
public static final int MIN_PRI | 최소우선순위 : 1 |
public static final int AVG_PRI | 보통 우선 순위 : 5 |
setPriority(새로운우선순위값) | 우선순위 값 설정 |
int getPriority() | 우선순위 값 반환 |
쓰레드는 우선순이 값을 갖습니다. 우선순위에 따라서 쓰레드는 동작하며, 우선순위는 1~10을 가질 수 있습니다. 아무 설정도 없을 시 우선순위는 5입니다. setPriority로 우선순위를 설정해줄 수 있습니다.
자바 쓰레드 메소드
sleep(long millis, int nanos) | 지정된 시간동안 쓰레드를 일시정지시킨다. 시간이 지나면 자동으로 실행대기 상태가 된다. (try-catch 블록을 사용하여 예외처리를 해야된다.) |
join(long millis, int nanos) | 지정된 시간동안 쓰레드가 실행되도록한다. 지정된 시간이 지나거나 작업이 종료되면 join()을 호출한 쓰레드로 돌아와 실행을 계속합니다. |
void interrupt() | sleep()이나 join에 의해 일시정지된 쓰레드를 다시 실행대기상태로 바꾼다. |
void suspend() | 쓰레드를 일시정지 시킨다. resume()이 호출되어야 실행대기상태가 된다. |
void resume() | suspend()로 일시정지된 쓰레드를 다시 실행대기상태로 만든다. |
void yield() | 실행 중에 자신에게 주어진 실행시간을 다른 쓰레드에게 양보하고 자신은 실행대기 상태가 된다. |
쓰레드의 Life-Cycle
- 쓰레드가 생성되고 start()를 호출하면 바로 실행되는 것이 아니라 실행대기상태열에 저장되어 자신의 차례가 될 때가지 기다린다.
- 실행되기상태에 있다가 자신의 상태가 되면 실행된다.
- 주어진 실행시간이 다 되거나 yield()를 만나면 다시 실행대기상태가 되고 다음 차례의 쓰레드가 실행상태가 된다.
- 실행중 suspend(), sleep(), wait(), join(), I/0 block에 일시정지상태가 될 수 있다.
- 저장된 일시정지시간이 다되거나(time-out),notify(),resume(),interrupt()가 호출되면 일시정지상태를 벗어나 다시 실행대기열에 저장되어 자신의 차례를 기다린다.
- 실행을 모두 마치거나stop()이 호출되면 쓰레드는 소멸된다.
참조
1.https://dailyworker.github.io/java-thread/
Java Thread - 자바 쓰레드
개요해당 장에서는 멀티 스레드 프로그래밍의 개념을 잡기 위해서 프로세스와 쓰레드에 대한 내용을 학습한다. 블로그의 내용은 “자바의 정석 개정 3판”을 정리하였다.
dailyworker.github.io
2.http://tcpschool.com/java/java_usingMethod_overloading
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
'Java > Spring' 카테고리의 다른 글
[eGovFramework] 폼 검증(Form validation)하기 (0) | 2020.06.15 |
---|---|
Math 클래스 (0) | 2020.05.25 |
String, StringBuffer (0) | 2020.05.25 |
[JSTL] import (0) | 2020.05.22 |
제네릭(Generic) (0) | 2020.05.20 |
댓글