[Java] Thread (스레드)
용어정리
프로세스: 실행중인 프로그램
멀티태스킹: 두가지 이상의 작업을 동시에 처리멀티
프로세스: 멀티태스킹을 할때 처리방법
-멀티태스킹과 멀티 프로세스는 다르다.
스레드
- 코드의 실행 흐름
-멀티스레드는 프로그램 내부에서의 멀티 태스킹
멀티스레드
-프로세스내에 여러 코드 실행 흐름
-프로세스가 두가지 이상의 작업을 처리할 수 있는 이유는 멀티 스레드가 있기 때문
싱글스레드 - 메인 스레드가 종료되면 프로세스도 종료
멀티스레드 - 실행중인 스레드가 하나라도 있다면 프로세스는 종료되지 않는다.
- 메인스레드가 작업스레드보다 먼저 종료 되더라도 프로세스는 종료 되지않는다.
Thread 클래스로 직접 생성
- Thread 클래스로부터 작업 스레드 객체를 직접 생성하려면 Runnable 구현 객체를 매개값으로 갖는 생성자를 호출
THread thread = new Thread(Runnable target);
Runnable은 스레드가 작업을 실행할 때 사용하는 인터페이스
익명 구현객체 사용하여 생성하는 방법
package study0526.Thread;
import java.awt.Toolkit;
public class P597_멀티스레드 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// ==== Runnable 익명 구현객체를 매개값 / 작업스레드 생성 ====
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Toolkit toolkit = Toolkit.getDefaultToolkit();
for (int i = 0; i < 5; i++) {
System.out.println("======");
try {
Thread.sleep(500);
} catch (Exception e) {
}
}
}
});
// ==== 작업스레드 실행 ====
thread.start();
// ==== 메인스레드 실행 코드 ====
for (int i = 0; i < 5; i++) {
System.out.println("띵");
try {
Thread.sleep(500);
} catch (Exception e) {
}
}
}//
}//
익명 자식객체 사용하여 생성하는 방법
package study0526.Thread;
import java.awt.Toolkit;
public class p600_멀티스레드2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//==== 익명 자식객체를 이용해 작업스레드 생성 ====
Thread thread = new Thread() {
@Override
public void run() {
// TODO Auto-generated method stub
Toolkit toolkit = Toolkit.getDefaultToolkit();
for (int i = 0; i < 5; i++) {
System.out.println("======");
try {
Thread.sleep(500);
} catch (Exception e) {
}
}
}
};
//==== 작업스레드 실행 ====
thread.start();
// ==== 메인스레드 실행 코드 ====
for (int i = 0; i < 5; i++) {
System.out.println("띵");
try {
Thread.sleep(500);
} catch (Exception e) {
}
}
}//
}//
스레드 이름변경
- thread.setName( "스레드이름")
package study0526.Thread;
import java.util.Iterator;
public class P601_스레드이름 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread mainThread = Thread.currentThread(); // 이코드를 실행하는 스레드 객체 참조얻기
System.out.println(mainThread.getName() + " 실행");
// ===== Thread-n 3개 생성 =====
for (int i = 0; i < 3; i++) {
Thread threadA = new Thread() {
@Override
public void run() {
System.out.println(getName() + " 실행");
}
};
threadA.start();
}
// ===== chat-thread로 이름 변경하여 생성 =====
Thread chatThread = new Thread() {
@Override
public void run() {
System.out.println(getName() + " 실행");
}
};
chatThread.setName("chat-thread");
chatThread.start();
}//
}//
스레드 상태
- 스레드 객체를 생성 (NEW) 하고 , start( ) 메소드를 호출하면 곧바로 실행이 아니라 실행대기상태 (RUNNABLE) 가 된다.
- 실행 대기하는 스레드는 CPU 스케쥴링에 따라 CPU를 점유하고 run( ) 메소드를 실행한다. 이때 실행상태 (RUNNING) 가 된다.
- 스케쥴링에 따라 실행상태와 실행 대기 상태를 번갈아가면서 run( ) 메소드를 조금씩 실행한다.
- 실행 상태에서 run( ) 메소드가 종료되면 더 이상 실행할 ㅋ코드가 없기때문에 종료상태 (TERMINATED) 가 된다.
- 실행 상태에서 일시정지 상태로 가기도 하는데 다시 실행대기 상태를 거친후 실행상태가 된다.
다른 스레드의 종료를 기다림
-ThreadA가 ThreadB의 join( ) 메소드를 호출하면 ThreadA는 ThreadB가 종료할 때까지 일시정지 상태가 된다.
다른 스레드에게 실행 양보
- 다른 스레드에게 실행을 양보하고 자신은 실행 대기 상태로 가는것 ( 프로그램 성능에 도움 )
- Thread.yield( );