자바 공부/[자바] 기본 공부
[자바 공부 4일차] 쓰레드와 상태 제어
햅2024
2024. 11. 11. 20:06
start() : 시작
sleep() : 주어진 시간 만큼 blocked 된 후 다시 run으로 돌아온다.
wait() : notify() 할 때까지 blocked 돼 있는다
yield() : 다른 쓰레드에게 자원을 양보한다.
join() : 종료될 때까지 대기
- Join
join을 사용하면 해당 쓰레드가 끝날 때까지 기다린다.
더보기
더보기
package JavaUtil.exam;
public class MyThread5 extends Thread {
public void run()
{
for(int i=0;i<5;i++) {
System.out.println("My Thread5 : " + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package JavaUtil.exam;
public class JoinExam {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyThread5 t5 = new MyThread5();
t5.start();
System.out.println("시작");
try {
t5.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //해당 쓰레드가 끝날 떄까지 기다림
System.out.println("종료");
}
}
시작
My Thread5 : 0
My Thread5 : 1
My Thread5 : 2
My Thread5 : 3
My Thread5 : 4
종료
- Wait와 notify
a라는 쓰레드에서 b.wait() 했을 때:
a 쓰레드를 b라는 쓰레드에서 notify 할 때까지 멈춰놓는다.
package JavaUtil.exam;
public class ThreadB extends Thread {
int total;
public void run()
{
synchronized (this) {
for(int i=0;i<5;i++) {
System.out.println(i + "를 더합니다");
total+= i;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
notify();
}
}
}
package JavaUtil.exam;
public class ThreadA {
public static void main(String[] args) {
// TODO Auto-generated method stub
ThreadB b = new ThreadB();
b.start();
synchronized(b)
{
try {
System.out.println("b가 완료될 때까지 기다립니다");
b.wait();
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("Total is : " + b.total);
}
}
}
위와 같은 코드의 경우
ThreadA에서 ThreadB를 실행시키는 거다.
우선 ThreadB가 완료될 때까지 기다린다.
싱크로나이즈드 된 부분이 완료되면 notify()를 통해 wait된 A부분을 깨울 것이다.
그럼 그 다음 부분이 실행된다.
b가 완료될 때까지 기다립니다
0를 더합니다
1를 더합니다
2를 더합니다
3를 더합니다
4를 더합니다
Total is : 10
- 데몬 : 리눅스, 유닉스 계열의 운영체제에서 백그라운드로 동작하는 프로그램
- 데몬 쓰레드 : 자바에서 백그라운드로 동작하는 쓰레드(ex.자동 저장, 일정한 시간 마다 맞춤법 검사 등)
데몬 쓰레드는 일반 쓰레드가 모두 종료되면 강제적으로 종료된다.
package JavaUtil.exam;
public class DemonThread implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
while(true)
{
System.out.println("데몬 쓰레드가 실행 중입니다");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
break;
}
}
}
public static void main(String[] args) {
Thread t = new Thread(new DemonThread());
t.setDaemon(true); //Daemon쓰레드로 설정
t.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("메인쓰레드가 종료됩니다.");
}
}
데몬 쓰레드가 실행 중입니다
데몬 쓰레드가 실행 중입니다
메인쓰레드가 종료됩니다.