💡 스레드는 하나의 코드 실행 흐름
main 메서드
이다.main 메서드
를 실행 시켜주는 것이 메인 스레드
이다.메인 스레드
만 가지는 싱글 스레드 프로세스이다.Runnable 인터페이스
를 구현한 객체에서 run()
을 구현하여 스레드를 생성하고 실행하는 방법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();
}
}
class ThreadTask1 implements Runnable {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.print("#");
}
}
}
Thread 클래스
를 상속 받은 하위 클래스에서 run()
을 구현하여 스레드를 생성하고 실행하는 방법public class ThreadExample2 {
public static void main(String[] args) {
ThreadTask2 thread2 = new ThreadTask2();
// 작업 스레드를 실행시켜, run() 내부의 코드를 처리하도록 합니다.
thread2.start();
}
}
class ThreadTask2 extends Thread {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.print("#");
}
}
}
public class ThreadExample1 {
public static void main(String[] args) {
// 익명 Runnable 구현 객체를 활용하여 스레드 생성
Thread thread1 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.print("#");
}
}
});
thread1.start();
for (int i = 0; i < 100; i++) {
System.out.print("@");
}
}
}
public class ThreadExample2 {
public static void main(String[] args) {
// 익명 Thread 하위 객체를 활용한 스레드 생성
Thread thread2 = new Thread() {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.print("#");
}
}
};
thread2.start();
for (int i = 0; i < 100; i++) {
System.out.print("@");
}
}
}
: 스레드는 기본적으로 이름이 가지고 있다.
main 스레드 -> main
그 외 추가적으로 생성된 스레드 -> Thread-n
// 실행중인 스레드의 이름을 알아야 할 때
Thread.currentThread().getName();
// 결과값
main
멀티 스레드의 경우 두 스레드가 동일한 데이터를 공유하게 되어 문제가 발생할 수 있다. 이를 방지하기 위해 임계영역
과 락
을 사용한다.
: 오로지 하나의 스레드만 코드를 실행할 수 있는 코드 영역
: 임계 영역을 포함하고 있는 객체에 접근할 수 있는 권한
synchronized
키워드를 사용하여 영역을 지정하는데 2가지 방법이 존재한다.synchronized
키워드를 작성한다.public synchronized boolean withdraw(int money) {...}
synchronized
(해당영역이 포함된 객체의 참조) {코드}public boolean withdraw(int money) {
synchronized (this) {
if (balance >= money) {
try { Thread.sleep(1000); } catch (Exception error) {}
balance -= money;
return true;
}
return false;
}
}
실행 대기 상태
로 만들어주는 메서드Thread.sleep();
로 호출하는 것을 권장💡 sleep() 메서드를 사용하여 스레드가 일시 정지 상태가 되었다. 다시 실행 대기 상태로 바꾸는 방법은?
1. 인자로 전달한 시간 만큼의 시간이 경과한 경우 실행 대기 상태로 바뀐다.
2.interrupt()
를 호출한 경우
interrupt()
를 호출하면 기본적으로 예외가 발생한다.sleep()
를 사용할 때는 try-catch문
을 사용해야 한다.try { Thread.sleep(1000);} catch (Exception e) {}