YJ의 새벽

JAVA (쓰레드의 메서드) 본문

SelfStudy/JAVA

JAVA (쓰레드의 메서드)

YJDawn 2023. 2. 7. 15:12

 

 

 

 

**static void sleep   :   천분의 일초.  5초 ( 5000 ) 

**void join      :   다른 쓰레드를 기다린다. 

**void interrupt  :  쓰레드를 깨운다.

**void suspend  :  일시정지

**void resume  : 다시 재생

**static void yield   :  양보

 

**static 붙은메서드는 자기 자신에게만 호출 가능하다.

 

 

  • static void sleep()  

--현재 쓰레드를 지정된 시간동안 멈추게한다.  ( 자기자신 ) 

--예외처리를 꼭 해야한다. (InterruptedException이 발생하면 깨어남 )

--특정 쓰레드를 지정해서 멈추게하는것은 불가능 .

 

class ThreadEx extends Thread{           // thread1 생성
	@Override
	public void run() {
		for(int i = 0; i < 300; i++) {
			System.out.println("-");
		}
		System.out.println("<<thread1>> 종료");
	}
} //end of ThreadEx
class ThreadEx2 extends Thread{         //thread2 생성
	@Override
	public void run() {
		for(int i = 0; i < 300; i++) {
			System.out.println("|");
		}
		System.out.println("<<thread2>> 종료");
	}
} //end of ThreadEx2
public class Example {
	public static void main(String[] args) {

		ThreadEx thread1 = new ThreadEx();
		ThreadEx2 thread2 = new ThreadEx2();
		thread1.start();
		thread2.start();
		
		try {
			Thread.sleep(2000);           //main쓰레드 2초 잠듬.
		}catch(InterruptedException e) {}
		                           
		  //   delay(2000);                 delay메서드로 2초재운다.       
		
		System.out.println("<<main>> 종료");
	}
	
	
	static void delay ( long millis ) {       // delay메서드 작성.
		try {
			Thread.sleep(millis);
		}catch(InterruptedException e) {}
	}
}

 

 

 

 

  • void interrupt()

--자고있는 쓰레드를 깨운다.

--대기상태 인 쓰레드를 실행대기상태 로 만든다.

-- WAITING --> RUNNABLE 

import javax.swing.JOptionPane;

class ThreadEx extends Thread{
	@Override
	public void run() {
		int i = 10;
		
		while( i != 0 && !isInterrupted()) {
			System.out.println(i--);
			for(long x=0 ; x <2500000000L ; x++);  //시간 지연
		}
		System.out.println("카운트 종료");
	}
} //end of ThreadEx

public class Example {
	public static void main(String[] args) {
		
		ThreadEx thread = new ThreadEx();
		thread.start();
		
		System.out.println("isInterrupted() :"+ thread.isInterrupted());   // false

		String input = JOptionPane.showInputDialog("아무거나입력하세요");
		System.out.println("입력값: "+ input);
		thread.interrupt();      // interrupt() 호출하면, interrupted 상태가 true 가 됨.
		                         // "카운트 종료" 
		System.out.println("isInterrupted() :"+ thread.isInterrupted());   // true
	}
}

 

 

  • suspend() resume() stop()

void suspend ()  : 쓰레드를 일시정지 시킨다.

void resume () :  suspend() 에 의해 일시정지된 쓰레드를 실행대기로 만든다.

void stop ()    :  쓰레드를 즉시 종료시킨다.

 

package Example1;

class ThreadEx implements Runnable{

	public void run() {
		while(true) {
			System.out.println(Thread.currentThread().getName());
			try {
				Thread.sleep(1000);           //1초마다 쓰레드이름이 찍힘.
			}catch(InterruptedException e) {
			}
		}
	}
} //end of ThreadEx
public class Example {
	public static void main(String[] args) {
		
		ThreadEx threadEx = new ThreadEx();
		Thread th1 = new Thread(threadEx,"*");
		Thread th2 = new Thread(threadEx,"**");
		Thread th3 = new Thread(threadEx,"***");
		th1.start();
		th2.start();
		th3.start();
		
		try {
			Thread.sleep(2000);
			th1.suspend();         // th1 잠시 중단
			Thread.sleep(2000);          //2초후
			th2.suspend();         // th2 잠시 중단
			Thread.sleep(3000);         //3초후
			th1.resume();          // th1 다시 동작
			Thread.sleep(3000);         //3초후
			th1.stop();           //  th1 강제종료
			th2.stop();           //  th2 강제종료
			Thread.sleep(2000);         //2초후
			th3.stop();           //  th3 강제종료
			
		}catch(InterruptedException e) {
			
		}
	}
}

 

 

  • join() , static void yield()

join : 지정된 시간동안 특정 쓰레드가 작업하는 것을 기다린다.

   --sleep 과 마찬가지로 예외처리를 해줘야한다. 

static void yield  :  남은시간을 다음 쓰레드에게 양보하고, 자신은 실행대기한다.

 

**join () 예제

class ThreadEx extends Thread{
	@Override
	public void run() {
		for(int i=0; i < 300 ; i++) {
			System.out.print("-");
		}
	}
} //end of ThreadEx
class ThreadEx2 extends Thread{
	@Override
	public void run() {
		for(int i=0; i < 300 ; i++) {
			System.out.print("|");
		}
	}
} //end of ThreadEx2
public class Example {
	static long startTime = 0;
	
	public static void main(String[] args) {
		ThreadEx thread1 = new ThreadEx();
		ThreadEx2 thread2 = new ThreadEx2();
		thread1.start();
		thread2.start();
		startTime=System.currentTimeMillis();      //시작시간

		try {
			thread1.join();               //main쓰레드가 thread1 을 기다림
			thread2.join();               //main쓰레드가 thread2 를 기다림.
		}catch(InterruptedException e) {
			
		}                     
		System.out.println("소요시간: "+(System.currentTimeMillis()-startTime));
	}                               
}                                          //다 기다린 후 걸린시간 측정.

'SelfStudy > JAVA' 카테고리의 다른 글

JAVA ( 람다식 )  (0) 2023.02.09
JAVA ( 쓰레드의 동기화 )  (0) 2023.02.08
JAVA ( 데몬 쓰레드 )  (0) 2023.02.07
JAVA (쓰레드 thread)  (0) 2023.02.07
JAVA (애너테이션)  (0) 2023.02.06
Comments