일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 맥
- spring
- FastAPI
- API
- 컬렉션프레임워크
- Mac
- 이클립스
- servlet
- Error
- 배열
- 자바
- 자바문제
- ddit
- Oracle
- Java
- html
- 객체지향
- crud
- 단축키
- Homebrew
- 대덕인재개발원
- JDBC
- jsp
- 생활코딩
- 반복문
- python
- Android
- ibatis
- nodejs
- pyqt
Archives
- Today
- Total
romworld
Thread 2 본문
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