✔️ 프로세스: 실행 중인 애플리케이션
✔️ 스레드: 하나의 코드 실행 흐름
메인 메소드를 실행시키는 스레드
여러 스레드가 동시에 작업을 수행
Runnable 인터페이스를 구현한 객체에서 run()을 구현하여 생성하고 실행하는 방법
class First implements Runnable {
public void run() {
// 스레드가 수행할 내용
}
}
public class ThreadExample {
public static void main(String[] args) {
Thread thread = new Thread(new First());
// 스레드 실행 -> run() 실행
thread.start();
}
}
Thread 클래스를 상속받은 하위 클래스에서 run()을 구현하여 스레드를 생성하고 실행하는 방법
class Second extends Thread {
@Override
public void run() {
// 스레드가 수행할 내용
}
}
class ThreadExample {
public static void main(String args[]) {
Second thread = new Second();
// 스레드 실행 -> run() 실행
tread.start();
}
}
멀티 스레드 프로세스의 경우, 같은 데이터에 동시에 공유하는 경우 발생
➡️ 데이터의 오류❗️
➡️ 한 스레드가 사용할 때 접근하지 못하도록 임계영역 필요
✔️ 임계영역 Critical Section
오직 하나의 스레드만 코드를 실행할 수 있는 코드 영역
synchronized
키워드로 임계 영역을 지정
✔️ 락 Lock
임계 영역을 포함하고 있는 객체에 접근할 수 있는 권한
임의의 스레드 A가 임계 영역 코드를 실행할 경우 A는 락을 갖게 되고, 다른 스레드들은 락이 없어서 임계 영역 코드를 실행할 수 없음!
public class ThreadNameExample {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
// 익명 객체
public void run() {}
});
thread.start();
// 스레드의 이름 조회 - 1
System.out.println("thread.getName() = " + thread.getName());
// 스레드의 이름 설정
thread.setName("code states");
// 스레드의 이름 조회 - 2
System.out.println("thread.getName() = " + thread.getName());
// 스레드의 이름을 setName()으로 바꾸어주었기 때문에 1과 2의 출력값은 다르다
// 스레드 인스턴스의 주소값
System.out.println(Thread.currentThread().getName());
}
}
sleep()
milli second 동안 스레드 멈춤 (정적 메소드)
interrupt()
일시 중지 상태인 스레드를 실행 대기 상태로 복귀
yield()
다른 스레드에게 실행 양보
join()
다른 스레드의 작업이 끝날 때까지 기다림 (인스턴스 메소드)
wait(), notify()
두 스레드가 교대로 작업할 때 사용