💡 스레드는 하나의 코드 실행 흐름
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) {}