반응형
Thread
- process 실행 중인 프로그램
- 프로그램이 실행되면 OS로 부터 메모리를 할당받아 프로세스 상태가 됨
- thread: 하나의 프로세스는 하나 이상의 thread를 가지게 되고, 실제 작업을 수행하는 단위는 thread이다
multi-threading
- 여러 thread가 동시에 수행되는 프로그래밍, 여러 작업이 동시에 실행되는 효과
- thread는 각각 자신만의 작업 공간을 가짐(context)
- 각 thread 사이에서 공유하는 자원이 있을 수 있음 (자바에서는 static instance)
- 여러 thread가 자원을 공유하여 작업이 수행되는 경우 서로 자원을 차지하려는 race condition이 발생할 수 있음
- 이렇게 여러 thread가 공유하는 자원중 경쟁이 발생하는 부분을 critical section 이라고 함
- critical section에 대한 동기화 (일종의 순차적 수행)을 구현하지 않으면 오류가 발생할 수 있음
Thread.currentThread(): 스레드 정보를 출력
- Thread[main,5,main]
main: 스레드가 실행된 함수, 5: 우선순위, main: 속한 그룹
package ch67;
import java.util.Iterator;
class MyThread extends Thread {
// 스레드가 시작 되면 수행될 메서드
@Override
public void run() {
int i;
for (i = 1; i <= 200; i++) {
System.out.print(i + "\t");
}
}
}
public class ThreadTest {
public static void main(String[] args) {
// Thread를 상속받았을 경우의 예
// Thread[main,5,main]
// main: 스레드가 실행된 함수, 5: 우선순위, main: 속한 그룹
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 인터페이스 구현하여 만들기
자바는 다중 상속이 허용되지 않으므로 이미 다른 클래스를 상속한 경우 thread를 만들기 위해 Runnable Interface를 구현하도록 한다.
class MyThread implements Runnable {
// 스레드가 시작 되면 수행될 메서드
@Override
public void run() {
int i;
for (i = 1; i <= 200; i++) {
System.out.print(i + "\t");
}
}
}
public class ThreadTest {
public static void main(String[] args) {
// Thread를 상속받았을 경우의 예
// Thread[main,5,main]
// main: 스레드가 실행된 함수, 5: 우선순위, main: 속한 그룹
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");
}
}
// 간단하게 실행할 경우 아래와 같이 사용할 수 있다.
Runnable run = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("1");
}
};
run.run();
스레드가 Runnable 에서 Not Runnable 상태로 변경될 때의 예
sleep(시간), wait(), join()
원래 상태로 돌아올 때의 예
sleap(시간) -> 시간이 지난 후
wait() -> notify(), notifyAll()
join() -> other thread exits
참고
JAVA 쓰레드란(Thread) ? - JAVA에서 멀티쓰레드 사용하기 | 기록하는 개발자 (honbabzone.com)
반응형
'언어 > JAVA' 카테고리의 다른 글
Thread 3 (멀티 스레드 동기화) (0) | 2021.05.29 |
---|---|
Thread 2 (여러 메서드) (0) | 2021.05.29 |
데코레이터 패턴 (0) | 2021.05.23 |
입출력 클래스(File, RandomAccessFile) (0) | 2021.05.23 |
DataStream, 직렬화 (0) | 2021.05.23 |