Java 다중 스레드 - 올바른 종료 스레드 방법
추천하지 않는 스톱 방법
Thread.stop () 는 폐기된 방법입니다. 추천되지 않는 이유는 stop 방법이 너무 폭력적이어서 절반까지 실행된 라인을 강제로 중지하고 이 라인의 모든 자물쇠를 즉시 방출하기 때문입니다.라인에서 인용된 대상의 일치성을 파괴할 수 있습니다.
예를 들어 데이터베이스에서 사용자 ID와 사용자 이름을 기록한 사용자 테이블을 유지하고 Thread 멀티스레드를 사용하여 두 개의 기록을 작성합니다. 1: ID=1,NAME=
2: ID=2,NAME=
기록 1을 반쯤 썼을 때 스톱에 의해 끝나면 여러 가지 이상한 현상이 나타날 수 있다.
1: ID=1,NAME=
2: ID=2,NAME=
그래서 당신이 무엇을 하고 있는지 확신하지 않으면 스톱 방법을 쉽게 사용하지 마세요.
표지의 위치를 판단하는 방법을 사용하여 라인을 중단하다
만약 확실히 라인을 끊을 필요가 있다면, 우리는 어떻게 해야 합니까?일반적으로 우리는 즉시 표지 위치를 설정하는 방법을 생각할 것이다. 즉, 라인에서 모든 절차를 실행하기 전에 라인을 종료해야 하는지 아닌지를 판단한다.class WorkThread extends Thread {
private boolean mExitThread = false;
public void exitThread() {
mExitThread = true;
}
@Override
public void run() {
if (mExitThread) {
return;
}
//do something
if (mExitThread) {
return;
}
//do something
if (mExitThread) {
return;
}
//do something
}
}
사실 Thread류는 이미 우리를 도와 이 중단 표지를 실현시켰다.Thread 중단과 관련된 세 가지 방법은 다음과 같습니다.
public void Thread.interrupt ()//스레드 중단public native boolean Thread.isInterrupted()//public static native boolean Thread가 중단되었는지 판단합니다.interrupted ()//중단 여부를 판단하고 현재 중단 상태를 지웁니다
그래서 위의 코드는 이렇게 고칠 수 있다.class WorkThread extends Thread {
@Override
public void run() {
if (isInterrupted()) {
return;
}
//do something
if (isInterrupted()) {
return;
}
//do something
if (isInterrupted()) {
return;
}
//do something
}
}
이럴 때 우리는 Thread만 호출하면 된다.interrupt () 방법은 안전하게 라인을 끊을 수 있습니다.
힌트가 필요한 건 Thread입니다.interrupt () 방법은 Thread와 같지 않습니다.stop () 방법은 바로 라인을 끝냅니다. 이것은 단지 중단 로고를 설정했을 뿐입니다. 코드 구현에서 이 로고를 수동으로 판단하고 내놓아야 합니다.
아래 코드처럼 Thread가 떨어지면 돼요.interrupt() 방법도 스레드를 중단하지 않습니다.class WorkThread extends Thread {
@Override
public void run() {
while(true){
//do something
}
}
}
Thread.interrupt의 장점
Thread를 사용합니다.interrupt에서 라인을 끊는 것은 로고 위치를 실현하는 고민을 면할 수 있을 뿐만 아니라 슬립과wait의 라인도 끊을 수 있다.
우리가 Thread를 호출하고 있는 것을 기억한다.sleep () 이 방법은 catch나 InterruptedException 이상을 던져야 합니까?try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
이InterruptedException 이상은 바로Thread를 호출했기 때문입니다.interrupt 방법으로 던졌습니다.그래서 Thread.interrupt는 Thread를 끊을 수 있습니다.sleep.마찬가지로 Thread.wait도 Thread.interrupt에서 끊겼어요.
주의해야 할 것은sleep 방법이 중단되어 이상을 던지면 중단 표시를 지울 것입니다.따라서catch가 이상할 때 인터럽트 표시를 다시 설정해야 합니다:Thread t1 = new Thread() {
@Override
public void run(){
while(true){
if(Thread.currentThread().isInterrupted()){
break;
}
System.out.println("hello world");
try{
Thread.sleep(1000);
}catch(InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
class WorkThread extends Thread {
private boolean mExitThread = false;
public void exitThread() {
mExitThread = true;
}
@Override
public void run() {
if (mExitThread) {
return;
}
//do something
if (mExitThread) {
return;
}
//do something
if (mExitThread) {
return;
}
//do something
}
}
class WorkThread extends Thread {
@Override
public void run() {
if (isInterrupted()) {
return;
}
//do something
if (isInterrupted()) {
return;
}
//do something
if (isInterrupted()) {
return;
}
//do something
}
}
class WorkThread extends Thread {
@Override
public void run() {
while(true){
//do something
}
}
}
Thread를 사용합니다.interrupt에서 라인을 끊는 것은 로고 위치를 실현하는 고민을 면할 수 있을 뿐만 아니라 슬립과wait의 라인도 끊을 수 있다.
우리가 Thread를 호출하고 있는 것을 기억한다.sleep () 이 방법은 catch나 InterruptedException 이상을 던져야 합니까?
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
이InterruptedException 이상은 바로Thread를 호출했기 때문입니다.interrupt 방법으로 던졌습니다.그래서 Thread.interrupt는 Thread를 끊을 수 있습니다.sleep.마찬가지로 Thread.wait도 Thread.interrupt에서 끊겼어요.
주의해야 할 것은sleep 방법이 중단되어 이상을 던지면 중단 표시를 지울 것입니다.따라서catch가 이상할 때 인터럽트 표시를 다시 설정해야 합니다:
Thread t1 = new Thread() {
@Override
public void run(){
while(true){
if(Thread.currentThread().isInterrupted()){
break;
}
System.out.println("hello world");
try{
Thread.sleep(1000);
}catch(InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.