YJ의 새벽
JAVA (쓰레드의 메서드) 본문
**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