다연이네

[days26] 스레드 예제 본문

Java

[days26] 스레드 예제

 다연  2020. 10. 26. 23:24
반응형

- 독립적인 2개의 스레드

package days26;

import javax.swing.JOptionPane;

public class Ex06_02 {

	public static void main(String[] args) {
		
		Runnable target = new InputThread();
		Thread t1 = new Thread(target, "t1");
		t1.start();
		
		ForThread t2 = new ForThread();
		t2.setName("t2");
		t2.start();

		System.out.println(Thread.currentThread().getName()+" =END=");
		//실행하면 main만나 창 띄우고 t1스타트-> main죽고 t1입력받을때까지 멈춰있으나 t2는 독립적이니까 6번 돌릴 것
		//t1과 t2는 독립적 (한쪽에선 영화다운받고 한쪽에선 채팅하고)

	}

}//class

//1. 대화상자 띄워서 입력받을 스레드
class InputThread implements Runnable{

	@Override
	public void run() {
		System.out.println("> "+Thread.currentThread().getName()+"스레드 시작");
		String input = JOptionPane.showInputDialog("아무 값이나 입력하세요"); 
		System.out.println(input);
		System.out.println("< "+Thread.currentThread().getName()+"스레드 종료");
	}

}

//2. for문을 돌리는 스레드
class ForThread extends Thread{
	@Override
	public void run() {
		System.out.println(">> "+Thread.currentThread().getName()+"스레드 시작");
		for (int i = 0; i <6; i++) {
			System.out.printf("[%s] - %d\n", Thread.currentThread().getName(), i);
			try {
				Thread.sleep(1000);//1초
			} catch (InterruptedException e) {
				e.printStackTrace();
			} 
		}
		System.out.println("<< "+Thread.currentThread().getName()+"스레드 종료");
	}
}

출력값

t1스레드와 t2스레드는 서로 독립적으로 실행되기 때문에 t1스레드가 종료되어도 t2는 계속된다.

 

[스레드의 상태]

NEW          스레드가 생성되고 아직 start() 메소드가 호출되지 않은 상태
RUNNABLE 실행 중 또는 실행 가능한 상태 (RUN상태(실제 일하고 있는 상태)와 구분 필요)

                 <-> NotRunnable은 죽은게 아니라 실행 불가능한 상태
BLOCKED    블러킹, 동기화 블럭에 의해 일시정지된 상태 (lock이 풀릴때까지 기다리는 상태)
WAITING, TIMED_WAITING 일시정지시간이 지정된 경우
TERMINATED 스레드의 작업이 종료된 상태

 

- 스레드 상태를 확인하는 코딩

package days26;

public class Ex07 {

	public static void main(String[] args) {
	

		노가다Worker 홍길동일꾼 = new 노가다Worker();
		System.out.println("1. "+홍길동일꾼.getState()); // NEW	
		홍길동일꾼.start(); //바로 일하는게 아니라 Runnable상태로 빠지는 것(일 대기중인 상태)
		System.out.println("2. "+홍길동일꾼.getState()); //RUNNABLE
		
		try {
			Thread.sleep(100); //일시정지하는 스레드는 누구 ? main
            //(홍길동일꾼은 RUN상태가 아니라 러너블 상태)
			//main이 0.1 쉬는동안 홍길동이 RUN 상태로 들어가고 메인은 RUNNABLE
		
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		//0.1초 후 main 스레드가 RUNNABLE 상태로 나옴
		System.out.println("3. "+홍길동일꾼.getState()); //TIMED_WAITING
        //홍길동일꾼 NotRunnable로 쉬러감 (1초동안 쉬는 중)
		
		
		try {
			Thread.sleep(5000); //main스레드 5초 sleep -> 4초쯤 홍길동 일꾼 나와서 삽질찍고 죽음
		} catch (InterruptedException e) {
			e.printStackTrace();
		} //1초동안 쉬던 홍길동일꾼이 5초동안 나올것이다 > 삽질 마지막으로 찍고 죽었을 것
		System.out.println("4. "+홍길동일꾼.getState()); //TERMINATED
		
	}

}
class 노가다Worker extends Thread{

	@Override
	public void run() {
		System.out.println("> 삽질...");
		try { //1초 쉬는동안 main이 나온다 
			Thread.sleep(1000); //p750 일정시간동안 스레드를 멈추게 한다
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("> 삽질...");
	}

}


sleep()메소드
1) 그 일정시간이 지나면 자동으로 그 스레드는 멈춘 것을 해제한다(실행 대기상태가 된다).
2) interrupt() 메소드가 호출되면 예외 발생해서 실행 대기 상태로 된다.

반응형
Comments