프로세스 : 실행중인 프로그램, 자원(resources)과 쓰레드로 구성
쓰레드 : 프로세스 내에서 실제 작업을 수행하는 단위
모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다
싱글쓰레드 프로세스 -> 프로세스 하나당 쓰레드 1개
멀티쓰레드 프로세스 -> 프로세스 하나당 쓰레드 n개
// 장점
- 시스템 자원을 보다 효율적으로 사용 가능
- 사용자에 대한 응답성이 향상됨
- 작업이 분리되어 코드가 간결
// 단점
- 동기화에 주의해야 함
- 교착상태(Dead-Lock)가 발생하지 않도록 주의해야 함
- 각 쓰레드가 효율적으로 고르게 실행 될 수 있게 해야함
-- 프로그래밍 할 때 고려해야 할 사항들이 많다
class MyThread extends Thread {
public void run() { // Thread클래스의 run()을 오버라이딩
/* 작업내용 */
}
}
MyThread t1 = new MyThread(); // 쓰레드 생성
t1.start(); // 쓰레드 실행
class MyThread2 implements Runnable {
public void run() { // Runnable인터페이스의 추상메서드 run()을 구현
/* 작업내용 */
}
}
Runnable r = new MyThread2()
Thread t2 = new Thread(r); // Thread(Runnable r)
// Thread t2 = new Thread(new MyThread2()); // 위의 두줄과 같음
t2.start();
MyThread t1 = new MyThread(); // 쓰레드 t1 생성
MyThread t2 = new MyThread(); // 쓰레드 t2 생성
t1.start(); // 쓰레드 t1을 실행
t2.start(); // 쓰레드 t2를 실행
void setPriority(int newPriority) // 쓰레드의 우선순위를 지정한 값으로 변경한다
int getPriority() // 쓰레드의 우선순위를 반환한다
public static final int MAX_PRIOITY = 10 // 최대우선순위
public static final int MIN_PRIOITY = 1 // 최소우선순위
public static final int NORM_PRIORITY = 5 // 보통우선순위
- 우리가 정해주는 쓰레드의 우선순위는 희망사항을 담아서 OS스케쥴러에게 전달 해줄 뿐이다
- OS에서 돌아가고 있는 수많은 프로세스와 쓰레드들을 무시하고 우리가 실행하는 프로그램에만 특혜를 줄 수 없다
- OS에서 실행중인 프로세스와 쓰레드가 골고루 잘 수행되도록 하는것이 OS스케쥴러의 역할이기 때문이다
Thread(ThreadGroup group, String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
ThreadGroup getThreadGroup() //쓰레드 자신이 속한 쓰레드 그룹을 반환
void uncaughtException(Thread t, Throwable e) // 처리되지 않은 예외에 의해
쓰레드 그룹의 쓰레드가 실행이 종료되었을 때 , JVM에 의해 이 메서드가 자동적으로 호출
public void run() {
while(true) {
try {
Thread.sleep(3 * 1000);
} catch(InterruptedException e) {}
// autoSave의 값이 true이면 autoSave()를 호출한다.
if(autoSave) {
autoSave();
}
}
}
boolean isDaemon() // 쓰레드가 데몬쓰레드인지 확인. 데몬쓰레드면 true 반환
void setDaemon(boolean on) // 쓰레드를 데몬쓰레드 또는 사용자 쓰레드로 변경.
매개변수 on을 true로 지정하면 데몬 쓰레드가 된다.
NEW
RUNNABLE
BLOCKED
WAITING, TIMED_WAITING
TERMINATED
- 쓰레드의 작업이 종료된 상태
// 지정된 시간(천분의 일초 단위)동안 쓰레드를 일시정지 시킨다.
지정한 시간이 지나고나면, 자동적으로 다시 실행대기 상태가 된다.
static void sleep(long millis)
static void sleep(long millis, int annos)
// 지정된 시간동안 쓰레드가 실행되도록 한다.
지정된 시간이 지나거나 작업이 종료되면 join()을 호출한 쓰레드로 다시 돌아와 실행을 계속한다
void join() // 다른 쓰레드 기다리기
void join(long millis)
void join(long millis, int nanos)
// sleep()이나 join()에 이ㅡ해 일시정지상태인 쓰레드를 깨워서 실행대기상태로 만든다.
해당 쓰레드에서는 interruptedException이 발생함으로써 일시정지상태를 벗어나게 된다.
void interrupt()
// 쓰레드를 즉시 종료시킨다.
void stop()
// 쓰레드를 일시정지시킨다. resume()을 호출하면 다시 실행대기상태가 된다.
void suspend()
// suspend()에 의해 일시정지상태에 있는 쓰레드를 실행대기상태로 만든다.
void resume()
// 실행 중에 자신에게 주어진 실행시간을 다른 쓰레드에게 양보하고 자신은 실행대기상태가 된다.
static void yield()
static void sleep(long millis) // 천분의 일초 단위
static void sleep(long millis, int annos) // 천분의 일초 + 나노초
try {
Thread.sleep(1, 500000); // 쓰레드를 0.0015초 동안 멈추게 함
} catch(InterruptedException e) {} // 아무것도 안넣어도됨. 어떤 문제가 있어서
발생한게 아니라 예외와 try_catch를
이용해서 잠자는 상태를 벗어나게 만든거라
catch문에서 할 게 없다.
void delay(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {}
}
-----------------------------------------
delay(15);
void interrupt() 쓰레드의 interrupted상태를 false에서 true로 변경
boolean isInterrupted() 쓰레드의 interrupted상태를 반환
static boolean interrupted() 현재 쓰레드의 interrupted상태를 알려주고,
false로 초기화
void suspend() 쓰레드를 일시정지 시킨다.
void resume() suspend()에 의해 일시정지된 쓰레드를 실행대기상태로 만든다.
void stop() 쓰레드를 즉시 종료시킨다.
// 직접 구현할 경우 간단한 예제
class ThreadEx1 implements Runnable {
boolean suspended = false;
boolean stopped = false;
public void run() {
while(!stopped) {
if(!suspended) {
/* 쓰레드가 수행할 코드를 작성 */
}
}
}
public void suspend () { suspended = true; }
public void resume () { suspended = false; }
public void stop () { stopped = true; }
void join() // 작업이 모두 끝날 때 까지
void join(long nmillis) // 천분의 일초동안
void join(long millis, int nanos) // 천분의 일초 + 나노초 동안
쓰레드의 동기화 - 한 쓰레드가 진행중인 작업을 다른 쓰레드가 간섭하지 못하게 막는것
public synchronized void calcSum() {
// ...
}
synchronized(객체의 참조변수) {
// ...
}