7 취소 및 닫 기
중단 은 필요 하 다
행위 의 좋 고 나 쁨 의 프로그램의 차이
작업 개념 취소
작업 취소 원인
주: 작업 에 취소 정책 이 포함 되 어야 하 는 것 처럼 스 레 드 에 도 인 터 럽 트 정책 이 포함 되 어야 합 니 다.
Thread 인 터 럽 트 관련 작업
주 2: interrupt 를 호출 하 는 것 은 목표 스 레 드 가 실행 중인 작업 을 즉시 중단 하 는 것 이 아니 라 중단 요청 정 보 를 전달 하 는 것 입 니 다!
인 터 럽 트 차단 라 이브 러 리 지원
주: 인 터 럽 트 에 응답 하 는 동작 은 인 터 럽 트 상 태 를 지우 고 Interrupted Exception 을 던 지 는 것 입 니 다.즉, Interrupted Exception 을 받 았 을 때 중단 상 태 는 false!
요청 수신 자 중단
작업 응답 중단 두 가지 방식
주 2: 스 레 드 인 터 럽 트 정책 을 실현 한 코드 만 인 터 럽 트 요청 을 차단 할 수 있 습 니 다. 일반적인 작업 과 라 이브 러 리 코드 에서 인 터 럽 트 요청 을 차단 해 서 는 안 됩 니 다!
스 레 드 를 어떻게 중단 합 니까?
인 터 럽 트 에 대한 작업 응답
표준 취소 작업 예제
package cn.weicm.cancel;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
/**
* Time: 2018/8/3 13:52
* Auth: weicm
*
* Desp:
*
* :
*
* - , timedRun
*
*
* :
*
* - , , timedRun
* - , timedRun , ,
*
*/
public class TimedRun1 {
private static final ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
public static void main(String[] args) {
try {
timedRun(() -> {
System.out.println("Task start ...");
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
System.out.println("Task is canceled!");
// , InterruptedException, Thread.interrupt() ,
return;
}
System.out.println("Task end ...");
}, 1, TimeUnit.SECONDS);
} finally {
ses.shutdown();
}
}
/**
* Time: 2018/8/3 14:20
* Auth: weicm
*
* Desp: ,
*
* @param task
* @param timeout
* @param unit
*/
static void timedRun(Runnable task, long timeout, TimeUnit unit) {
// ,
Thread currentThread = Thread.currentThread();
//
ScheduledFuture> future = ses.schedule(() -> {
currentThread.interrupt();
}, timeout, unit);
task.run();
// , , ,
future.cancel(true);
}
}
package cn.weicm.cancel;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
/**
* Time: 2018/8/3 15:36
* Auth: weicm
*
* Desp:
*
* :
*
* - TimedRun1
*
*
* :
*
* - join , join
*
*/
public class TimedRun2 {
private static final ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
public static void main(String[] args) throws Throwable {
try {
timedRun(() -> {
System.out.println("Task start ...");
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
System.out.println("Task is canceled!");
// , InterruptedException, Thread.interrupt() ,
return;
}
System.out.println("Task end ...");
}, 1, TimeUnit.SECONDS);
} finally {
ses.shutdown();
}
}
/**
* Time: 2018/8/3 14:20
* Auth: weicm
*
* Desp: ,
*
* @param task
* @param timeout
* @param unit
*/
static void timedRun(Runnable task, long timeout, TimeUnit unit) throws Throwable {
/**
* Time: 2018/8/3 14:42
* Auth: weicm
*
* Desp:
*/
class ThrowableTask implements Runnable {
private volatile Throwable e;
@Override
public void run() {
try {
task.run();
} catch (Throwable e) {
// : , ,
this.e = e;
}
}
/**
* Time: 2018/8/3 15:33
* Auth: weicm
*
* Desp:
*
* @throws Throwable
*/
public void rethrow() throws Throwable {
if (null != e)
throw e;
}
}
//
ThrowableTask t = new ThrowableTask();
Thread taskThread = new Thread(t);
taskThread.start();
//
ScheduledFuture> future = ses.schedule(() -> {
taskThread.interrupt();
}, timeout, unit);
taskThread.join(unit.toMillis(timeout));
// , , ,
future.cancel(true);
//
t.rethrow();
}
}
package cn.weicm.cancel;
import java.util.concurrent.*;
/**
* Time: 2018/8/3 16:38
* Auth: weicm
*
* Desp: Future
*
* :
*
* - TimedRun2 ,
*
*
* Futrue.cancel:
*
* - : true false, , ,
* - : true ; false ,
* - : true false,cancel ,
*
*/
public class TimedRun3 {
private static final ExecutorService es = Executors.newSingleThreadExecutor();
public static void main(String[] args) throws Exception{
try {
timedRun(() -> {
System.out.println("Task start ...");
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
System.out.println("Task is canceled!");
// , InterruptedException, Thread.interrupt() ,
return;
}
System.out.println("Task end ...");
}, 1, TimeUnit.SECONDS);
} finally {
es.shutdown();
}
}
/**
* Time: 2018/8/3 14:20
* Auth: weicm
*
* Desp: ,
*
* @param task
* @param timeout
* @param unit
*/
static void timedRun(Runnable task, long timeout, TimeUnit unit) throws Exception {
Future> future = es.submit(task);
try {
future.get(timeout, unit);
} catch (InterruptedException e) {
// ,
Thread.currentThread().interrupt();
} catch (ExecutionException e) {
// ,
throw e;
} catch (TimeoutException e) {
// , ,
} finally {
// , ; , , ,
// !
future.cancel(true);
}
}
}
끊 을 수 없 는 차단
자주 중단 할 수 없 는 차단 작업
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.