오답노트
[Java] Thread 본문
Thread
프로그램이 실행되면 OS로 부터 메모리를 할당받아 프로세스 상태가 된다.
thread 하나의 프로세스는 하나 이상의 thread를 가지게 되고, 실제 작업을 수행하는 단위는 thread이다.
Multi - Thread
쓰레드가 동시에 수행되는 프로그래밍이다. 이는 여러 작업이 동시에 실행되는 효과가 있다.
하지만 쓰레드가 모두 공유하는 데이터에 대해서 동기화를 구현하지 않으면 오류가 발생할 수 있다.
Thread 객체 상속
class MyThread extends Thread{
public void run() {
int i;
for(i = 1; i < 201 ; i++) {
System.out.print(i+"\t");
}
}
}
public class ThreadTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread() + "start");
MyThread th1 = new MyThread();
MyThread th2 = new MyThread();
th1.start();
th2.start();
System.out.println(Thread.currentThread() + "end");
}
}
Runnable 인터스페이스 사용
class MyThread implements Runnable{
@Override
public void run() {
int i;
for(i = 1; i < 201 ; i++) {
System.out.print(i+"\t");
}
}
}
public class ThreadTest {
public static void main(String[] args) {
System.out.println(Thread.currentThread() + "start");
MyThread runnable = new MyThread();
Thread th1 = new Thread(runnable);
Thread th2 = new Thread(runnable);
th1.start();
th2.start();
System.out.println(Thread.currentThread() + "end");
}
}
Thread 상태
쓰레드는 Runnable과 Not Runnable 상태가 존재하고
Runnable에서 쓰레드가 활동하기 시작하면 Run 상태, 쓰레드가 종료되면 Dead 상태가 된다.
또 Runnable 상태에서 sleep, wait, join 메소드를 통해 Not Runnable 상태로 변할 수 있다.
- sleep : 지정한 시간동안 Thread를 Not Runnable 상태로 만든다. 지정한 시간 후 다시 Runnable 상태가 된다.
- wait : 사용 가능한 리소스가 있을 때까지 Not Runnable 상태로 만든다. 사용 가능한 리소스가 있을 때, notify 함수를 통해 Runnable 상태가 된다.
- join : 다른 쓰레드가 멈출 때까지 기다리게 한다. 다른 쓰레드가 멈춘후 다시 Runnable 상태가 된다.
join 예제
public class JoinTest extends Thread{
int start;
int end;
int total;
public JoinTest(int start, int end) {
this.start = start;
this.end = end;
}
public void run() {
int i;
for(i = start ; i<=end; i++) {
total += i;
}
}
public static void main(String[] args) {
System.out.println(Thread.currentThread() + "start");
JoinTest jt1 = new JoinTest(1,50);
JoinTest jt2 = new JoinTest(51,100);
jt1.start();
jt2.start();
try {
jt1.join();
jt2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int lastTotal = jt1.total + jt2.total;
System.out.println(jt1.total);
System.out.println(jt2.total);
System.out.println(lastTotal);
System.out.println(Thread.currentThread() + "end");
}
}
join이 호출 되면 현재 진행 중이던 쓰레드(main)를 멈추고, join을 호출한 인스턴스의 쓰레드가 실행된다. 이 쓰레드가 끝날 떄까지 이전 진행 중이던 쓰레드는 Not Runnalbe 상태가 된다.
'Java' 카테고리의 다른 글
[Spring JPA] Spring Data JPA (0) | 2023.07.18 |
---|---|
[Java] Multi Thread Synchronization (0) | 2023.07.11 |
[Java] 직렬화 (0) | 2023.07.11 |
[Java] IOStream (0) | 2023.07.10 |
[Java] 사용자 정의 예외 처리 (0) | 2023.07.10 |