romworld

Thread 2 본문

JAVA/개념정리

Thread 2

inderrom 2022. 11. 27. 19:03
package kr.or.ddit.basic;

// 쓰레드의 상태를 출력하는 예제
// 쓰레드가 작동된다는 것은 run 메서드가 실행된다는 것

public class ThreadTest11 {

	public static void main(String[] args) {
		PrintThreadState th = new PrintThreadState(new TargetThread());
		
		th.start();
	}

}

// 쓰레드 상태의 검사 대상이 되는 쓰레드 작성
class TargetThread extends Thread{
	@Override
	public void run() { // for문이 진행될 때 runnable 
		for(long i=1L; i<=20_000_000_000L; i++) {}	// 시간 지연용 (아무것도 안하는 공회전용)
			try {
				Thread.sleep(1500);
			} catch (InterruptedException e) {
				// TODO: handle exception
			}
			
			for(long i=1L; i<=20_000_000_000L; i++) {}	// 시간 지연용 (아무것도 안하는 공회전용)
	}
}

// TargetThread의 현재 상태를 출력하는 쓰레드
class PrintThreadState extends Thread{
	private TargetThread target;

	// 생성자
	public PrintThreadState(TargetThread target) {
		this.target = target;
	}
	
	@Override
	public void run() {
		while(true) {
			// TargetThread의 현재 상태값 구하기
			Thread.State state =  target.getState(); // 현재의 쓰레드 상태값이 Thread.State라는 열거형으로 반환된다.
			System.out.println("TargetThread의 현재 상태값 : " + state);
			
			if(state == Thread.State.NEW) {	// 쓰레드의 상태가 NEW상태인지 검사
				target.start();
			}
			
			if(state == Thread.State.TERMINATED) {	// 쓰레드의 상태가 종료(TERMINATED) 상태인지 검사
				break;
			}
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO: handle exception
			}
			
		}
	}
	
}
package kr.or.ddit.basic;

// yield()메서드 연습

public class ThreadTest12 {
   public static void main(String[] args) {
      YieldThread th1=new YieldThread("1번 쓰레드");
      YieldThread th2=new YieldThread("2번 쓰레드");
      
      th1.start();
      th2.start();
      
      try {
         Thread.sleep(5);
      } catch (Exception e) {
         
      }
      System.out.println("------------------------------------11111111111111111111");
      th1.work=false;
      
      try {
         Thread.sleep(5);
      } catch (Exception e) {
         
      }
      System.out.println("------------------------------------22222222222222222222222");
      th1.work=true;
      
      try {
         Thread.sleep(5);
      } catch (Exception e) {
         
      }
      System.out.println("------------------------------------3333333333333333333333");
      
      th1.stop=true;
      th2.stop=true;
      
   }
}

// yield() 메서드 연습용 쓰레드
class YieldThread extends Thread{
   public boolean stop=false;
   public boolean work=true;
   
   //생성자
   public YieldThread(String name) {
      super(name);       // 쓰레드의 이름 설정하기
   }
   
   @Override
   public void run() {
      while(!stop) { //!가 있어서 stop이 true가 된다.
         if(work) {
            //getName()메서드 ==> 현재 쓰레드의 name속성값을 반환한다.
            System.out.println(getName() + " 작업중...");
         }else {
            System.out.println(getName()+" 양보...");
            Thread.yield();//양보
         }
      }
   }
}
package kr.or.ddit.basic;

/*
	Thread의 stop()메서드를 호출하면 쓰레드가 바로 멈춘다.
	이 때 사용하던 자원을 정리하지 못하고 쓰레드가 종료되어 나중에 실행되는
	쓰레드에 영향을 줄 수 있다.
	그래서 stop()메서드는 비추천으로 되어있다.
*/
public class ThreadTest13 {

	public static void main(String[] args) {
		/*
		
		ThreadStopTest1 th1 = new ThreadStopTest1();
		th1.start(); // 쓰레드 작동...

		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			// TODO: handle exception
		}

		// 쓰레드 멈추기
		// th1.stop();
		th1.setStop(true); // stop을 쓰면 안되므로 set에다가 true를 넣어줌
		 */
		//---------------------------------------------------------------
		
		// interrupt()메서드를 이용한 쓰레드 멈추기
		ThreadStopTest2 th2 = new ThreadStopTest2();
		th2.start();
		
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			// TODO: handle exception
		}
		
		th2.interrupt();	// 멈추게될 쓰레드에게 interrupt 신호를 보낸다.
		// 인터럽트는 빠져나올때 익셉션을 일으키면서 빠져나옴
		
	}

}

// 쓰레드를 멈추게하는 연습용 쓰레드
class ThreadStopTest1 extends Thread {
	private boolean stop;

	public void setStop(boolean stop) {
		this.stop = stop;
	}

	@Override
	public void run() {
		while (!stop) {
			System.out.println("쓰레드 실행 중...");
		}

		// 자원 정리를 진행한 후 종료되도록 한다.
		System.out.println("자원 정리 중...");

		System.out.println("쓰레드 종료...");

	}
}

// interrupt()메서드를 이용하여 쓰레드를 멈추게 하는 연습용 쓰레드
class ThreadStopTest2 extends Thread {
	@Override
	public void run() {
		/*
		// 방법1 ==> interrupt()메서드와 sleep()메서드를 이용한 방법
		try {
			while (true) {
				System.out.println("Thread 실행중~~~~");
				
				Thread.sleep(1);
			}
		} catch (InterruptedException e) {
			// TODO: handle exception
		}
		*/
		
		// 방법2
		while(true) {
			System.out.println("쓰레드 실행중 @@@@@@@@@@@@@@ ");
			
			// interrupt() 메서드가 호출되었는지 여부 검사하기
			
			/*
			// 검사방법1 ==> 쓰레드의 인스턴스 메서드인 isInterrupted()메서드 이용하기
			//			isInterrupted()메서드는 interrupt()메서드가 호출되면 true를 반환한다.
			if(this.isInterrupted()==true) {
				break;
			}
			*/
			// 검사방법2 ==> 쓰레드의 정적 메서드인 interrupted()메서드 이용하기
			//			interrupted()메서드는 interrupt()메서드가 호출되면 true를 반환한다.
			if(Thread.interrupted()==true) {
				break;
			}
		}
		System.out.println("자원 정리 중....");
		System.out.println("쓰레드 종료...");
	}
}
package kr.or.ddit.basic;

/*
	Thread의 stop()메서드를 호출하면 쓰레드가 바로 멈춘다.
	이 때 사용하던 자원을 정리하지 못하고 쓰레드가 종료되어 나중에 실행되는
	쓰레드에 영향을 줄 수 있다.
	그래서 stop()메서드는 비추천으로 되어있다.
*/
public class ThreadTest13 {

	public static void main(String[] args) {
		/*
		
		ThreadStopTest1 th1 = new ThreadStopTest1();
		th1.start(); // 쓰레드 작동...

		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			// TODO: handle exception
		}

		// 쓰레드 멈추기
		// th1.stop();
		th1.setStop(true); // stop을 쓰면 안되므로 set에다가 true를 넣어줌
		 */
		//---------------------------------------------------------------
		
		// interrupt()메서드를 이용한 쓰레드 멈추기
		ThreadStopTest2 th2 = new ThreadStopTest2();
		th2.start();
		
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			// TODO: handle exception
		}
		
		th2.interrupt();	// 멈추게될 쓰레드에게 interrupt 신호를 보낸다.
		// 인터럽트는 빠져나올때 익셉션을 일으키면서 빠져나옴
		
	}
}

// 쓰레드를 멈추게하는 연습용 쓰레드
class ThreadStopTest1 extends Thread {
	private boolean stop;

	public void setStop(boolean stop) {
		this.stop = stop;
	}

	@Override
	public void run() {
		while (!stop) {
			System.out.println("쓰레드 실행 중...");
		}

		// 자원 정리를 진행한 후 종료되도록 한다.
		System.out.println("자원 정리 중...");

		System.out.println("쓰레드 종료...");

	}
}

// interrupt()메서드를 이용하여 쓰레드를 멈추게 하는 연습용 쓰레드
class ThreadStopTest2 extends Thread {
	@Override
	public void run() {
		/*
		// 방법1 ==> interrupt()메서드와 sleep()메서드를 이용한 방법
		try {
			while (true) {
				System.out.println("Thread 실행중~~~~");
				
				Thread.sleep(1);
			}
		} catch (InterruptedException e) {
			// TODO: handle exception
		}
		*/
		
		// 방법2
		while(true) {
			System.out.println("쓰레드 실행중 @@@@@@@@@@@@@@ ");
			
			// interrupt() 메서드가 호출되었는지 여부 검사하기
			
			/*
			// 검사방법1 ==> 쓰레드의 인스턴스 메서드인 isInterrupted()메서드 이용하기
			//			isInterrupted()메서드는 interrupt()메서드가 호출되면 true를 반환한다.
			if(this.isInterrupted()==true) {
				break;
			}
			*/
			
			// 검사방법2 ==> 쓰레드의 정적 메서드인 interrupted()메서드 이용하기
			//			interrupted()메서드는 interrupt()메서드가 호출되면 true를 반환한다.
			if(Thread.interrupted()==true) {
				break;
			}
		}
		System.out.println("자원 정리 중....");
		System.out.println("쓰레드 종료...");
	}
}

'JAVA > 개념정리' 카테고리의 다른 글

Properties , ResourceBundle  (0) 2022.11.27
JDBC  (0) 2022.11.27
Thread 경마 프로그램  (0) 2022.11.27
Thread  (0) 2022.10.31
Generic  (0) 2022.10.31
Comments