스레드 (Thread)
싱글 스레드 프로세스 (Single Thread Process)
멀티 스레드 프로세스 (Multi Thread Process)
자바 애플리케이션을 실행하면 가장 먼저 실행되는 main 메서드
main 메서드를 실행시켜주는 Main Thread
메인 스레드는 코드의 끝을 만나거나 return문을 만나면 실행 종료
스레드의 생성과 실행
작업 스레드를 생성 및 실행하는 방법
public class ThreadExample1 {
public static void main(String[] args) {
// Runnable 인터페이스 구현 객체 생성
Runnable task1 = new ThreadTask1();
// Runnable 구현 객체를 인자로 전달
//Thread 클래스를 인스턴스화하여 스레드 생성
Thread thread1 = new Thread(task1);
// 위 두 줄을 한 줄로 축약 가능
// Thread thread1 = new Thread(new ThreadTask1());
// 작업 스레드를 실행시켜 run()내부 코드 처리하도록
thread1.start();
// 반복문 추가
for (int i = 0; i < 100; i++) {
System.out.print("@");
}
}
}
// Runnable 인터페이스를 구현하는 클래스
class ThreadTask1 implements Runnable {
// run() 메서드 바디에 스레드 수행 작업 내용 작성
public void run() {
for (int i = 0; i < 100; i++) {
System.out.print("#");
}
> @와 #이 랜덤으로 섞인 채 출력
public class ThreadExample2 {
public static void main(String[] args) {
// Thread 클래스 상속받은 클래스 인스턴스화 후 스레드를 생성
Thread thread2 = new ThreadTask2();
thread2.start();
for (int i = 0; i < 100; i++) {
System.out.print("@");
}
}
}
// Thread 클래스 상속받는 클래스 작성
class ThreadTask2 extends Thread {
// run() 메서드 바디에 스레드 수행 작업 내용 작성
public void run() {
for (int i = 0; i < 100; i++) {
System.out.print("#");
}
}
스레드 이름 조회
스레드참조값.getName()
으로 조회 가능스레드참조값.setName()
으로 이름 설정 가능currentThread()
사용Thread thread3 = new Thread(new Runnable() {
public void run() {
System.out.println("Get Thread Name");
}
});
thread3.start();
System.out.println("thread3.getName() = " + thread3.getName());
> 출력
> Get Thread Name
> thread3.getName() = Thread-0
------------------------------
Thread thread4 = new Thread(new Runnable() {
public void rn() {
System.out.println("Set And Get Thread Name");
}
});
thread4.start();
System.out.println("thread4.getName() = " + thread4.getName());
thread4.setName("Code States");
System.out.println("thread4.getName() = " + thread4.getName());
> 출력
> Set And Get Thread Name
> thread4.getName() = Thread-0
> thread4.getName() = Code States
스레드 동기화
멀티 스레드 프로세스의 경우, 두 스레드가 동일한 데이터를 공유작업 시, 스레드가 사용 중인 객체를 다른 스레드가 변경할 수 없도록 스레드 작업이 끝날 때까지 객체에 잠금을 걸어 다른 스레드가 사용못하도록 해야함
임계영역 (Critical section)
락 (Lock)
메서드 전체 임계 영역 지정
synchronized
키워드 작성 시 메서드 전체를 임계 영역으로 설정 가능특정 영역을 임계 영역 지정
synchronized
키워드와 소괄호()
안에 해당 영역이 포함된 객체의 참조를 넣고, 블럭을 열어 블럭 내에 코드 작성class Account {
...
public boolean withdraw(int money) {
synchronized (this) {
if (balalce >= money) {
try {
Thread.sleep(1000);
} catch (Exception e) {}
balance -= money;
return true;
}
}
}
}
스레드 상태
상태 | 열거 상수 | 설명 |
---|---|---|
객체 상태 | NEW | 스레드 객체 생성. start() 메서드 호출 전 |
실행 대기 | RUNNABLE | 언제든 실행상태로 갈 수 있음 |
일시 정지 | BLOCKED | 사용하려는 객체의 Lock이 풀릴때까지 대기 |
일시 정지 | WAITING | 다른 스레드가 통지할때까지 대기 |
일시 정지 | TIMED_WAITING | 주어진 시간동안 대기 → .sleep(Time) |
종료 | TERMINATED | 실행 종료 |
알려주셨던 꿀팁?들 정말 효과 확실했습니다! 감사합니다!