thread
사용자가 작성한 코드로서 JVM에 의해 스케줄링되어 실행되는 코드의 실행흐름
하나의 응용프로그램은 여러개의 스레드로 구성 가능하다.
즉, 한 스레드가 대기하는 동안 다른 스레드를 실행할수 있다.
Web Server의 thread는 각 클라이언트당 thread를 생성하여 동시에 많은 클라이언트의 요청을 수행한다.
JAVA에서의 Thread
JVA에 의해 스케쥴되는 실행 단위의 코드 블럭.
thread의 생명 주기는 JVM에 의해 관리된다.
-> 하나의 JVM은 하나의 자바 응용프로그램만 실행한다.
하나의 응용프로그램은 하나 이상의 스레드로 구성이 가능하다.
두개의 자바 응용 프로그램을 동시에 실행시키고자 하면,
두개의 JVM을 이용하여 응용프로그램 간의 Soket 통신을 이용하여 수행한다 (ex 채팅프로그램)
각 thread에는 thread 코드가 있으며, JVM은 정해진 우선순위에 따라 수행한다.
JAVA에서 thread를 만드는 2가지 방법
1) java.lang.Thread 클래스를 이용한 thread 생성
2) java.lang.Runnable 인터페이스를 이용한 thread 생성
Thread 클래스를 이용한 스레드 생성
// Thread클래스는 Runnable 인터페이스를 구현한 클래스이다.
public class TimerThread extends Thread {
int n=0;
@Override
// Thread 클래스의 run 메소드를 오버라이딩해서 사용.
public void run() { //스레드에서 실행하고자 하는 코드 작성
while(true) {
System.out.println(n);
n++;
try {
sleep(1000);
} // 1000분의 1초 만큼 작업을 쉬는 메소드 :즉 while 무한루프를 돌면서 1초간격으로 n이 증가한다.
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class TestThread {
public static void main(String[] args) {
// Thread 클래스를 상속받아 run 메소드를 내가원하는 작업으로 오버라이딩한 TimerThread 객체 생성
TimerThread th= new TimerThread();
th.start(); // thread 작업 시작은 start()메소드로 시작한다.
}
}
Runnable 인터페이스를 이용한 스레드 생성
// Runnable 인터페이스를 상속 받아 구현
public class TimerRunnable implements Runnable{
int n=0;
@Override
public void run() {
System.out.println(n);
n++;
try {
Thread.sleep(1000); //sleep는 Thread의 static method.
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class TestRunnable {
public static void main(String[] args) {
// Runnable로 만든 스레드는 Thread 객체의 생성자로 호출된다.
Thread th = new Thread(new TimerRunnable());
th.start();
}
}
위와 같은 방식으로 원하는 thread 작업을 run 메소드를 오버라이딩하여 만든 thread 들을 메인 스레드에서 start() 메소드를 통해 동시 다발적으로 수행할 수 있다.
class ThreadEx1 extends Thread{
@Override
public void run() { //스레드 구현
for (int i = 0; i < 5; i++) {
System.out.println("i: "+i);
}
}
}
class ThreadEx2 implements Runnable{
@Override
public void run() { //스레드 구현
for (int k = 10; k < 15; k++) {
System.out.println("k: "+k);
}
}
}
public class ThreadEx {
public static void main(String[] args) {
ThreadEx1 t1 = new ThreadEx1();
// Thread t2 = new Thread(new ThreadEx2());
Runnable r = new ThreadEx2(); //위와 같은 방식, 인터페이스도 참조 변수를 선언할수있다.
Thread t2 = new Thread(r);
t1.start();
t2.start();
}
}
작업결과 : 1번 thread와 2번 thread의 작업이 동시에 무작위로 수행된다.
thread의 상태
1. NEW : 스레드가 생성 되었지만, 아직 실행할 준비가 되지않았다.
2. Runnable : 스레드가 현재 실행되고 있거나, 실행 준비되어 스케쥴링을 기다리는 상태
3. Waiting : wait()를 호출한 상태, 다른 스레드가 notify(), notifyAll()을 해주기를 기다리고 있는 상태.
4. Timed_waiting : sleep()을 호출하여 잠을 자고있는 상태.
5. Block : 스레드가 I/O 작업(입출력)을 요청하면 JVM이 자동으로 BLOCK상태로 만든다.
6. Terminated : 스레드가 종료한 상태
스레드의 우선순위와 스케쥴링
스레드의 우선순위
기본값 = 5(Normal_Priority)
최대값 = 10
최소값 = 1
JVA 이 우선순위에 의해 실행(동일한 스레드는 돌아가면서 스케쥴링)
'Category > JAVA' 카테고리의 다른 글
Apache Commons Library (0) | 2024.05.09 |
---|---|
[JAVA] 네트워크, Server와 socket (0) | 2023.11.15 |
[JAVA] Collection FrameWork (0) | 2023.11.13 |
[JAVA] Object클래스& ==연산자와 equals메소드 (0) | 2023.11.10 |
[JAVA] 예외 처리 (0) | 2023.10.24 |