Java 스레드를 닫는 3가지 방법
1. 상태 위치 사용, 이것은 간단, 더 이상 말할 필요가 없다:
public class Task extends Thread {
private volatile boolean flag= true;
public void stopTask() {
flag = false;
}
@Override
public void run() {
while(flag){
/* do your no-block task */
}
}
}
2.어떤 사건이 발생하기를 기다리다가 막히면 또 무슨 일이 일어날까요?물론 스레드가 막히면 공유 변수를 검사할 수도 없고 멈출 수도 없다.이것은 많은 상황에서 발생할 수 있다. 예를 들어 Object를 호출하는 것이다.wait()、Thread.sleep 등, 여기는 조금만 들어요.그들은 모두 영원히 라인을 막을 수 있다.시간 초과가 발생하더라도 시간 초과가 끝나기 전에 계속 기다리는 것은 불가능하고 부적절하기 때문에 어떤 메커니즘을 사용하여 라인이 더 일찍 막힌 상태에서 물러나도록 해야 한다.이럴 때 너는 사용할 수 있다
Thread.interrupt();
public class BlockTask extends Thread {
@Override
public void run() {
try {
while (!Thread.interrupted()) {
/* do your block task*/
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
그러나 위의 코드는 좀 부적절할 수도 있고, 예를 들면 문제를 더욱 분명하게 말할 수도 있다.너는 이 코드 세그먼트가 막힐 수 있다는 것을 어떻게 알았니?interrupt () 함수는 도대체 무슨 뜻입니까?우선,interrupted () 방법은 Interrupted Exception에서 벗어나는 이상한 막힘만 해결할 수 있다는 것을 설명한다.인터페이스 () 는 차단 라인을 닫는 것이 아니라 차단을 해제하는 것입니다.그럼 여기서 폐쇄 라인이 막힌 예를 들겠습니다
public class BlockTask extends Thread {
@Override
public void run() {
try {
sleep(10000);
} catch (InterruptedException e) {
System.out.println("if yout use interrupt you will see me");
}
}
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
BlockTask task = new BlockTask();
task.start();
Thread.sleep(1000);
task.interrupt();
}
}
3.위에서 말했듯이interrupt () 는 Interrupted Exception의 막힌 라인만 해결할 수 있습니다. 그러면 다른 io 막힌 부분을 만나면 어떻게 처리합니까?이때 자바는 상응하는 차단 방법을 제공할 것이다.예를 들어 서버가 요청 (request) 을 기다려야 하거나, 네트워크 응용 프로그램이 원격 호스트의 응답을 기다려야 할 수도 있습니다. 이때 플러그인close () 방법을 사용할 수 있습니다
public class SocketTask extends Thread {
private volatile ServerSocket server;
public void stopTask(){
try {
if(server!=null){
server.close();
System.out.println("close task successed");
}
} catch (IOException e) {
System.out.println("close task failded");
}
}
@Override
public void run() {
try {
server = new ServerSocket(3333);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
SocketTask task = new SocketTask();
task.start();
Thread.sleep(1000);
task.stopTask();
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.