(1)
가장 좋은 방법은 시간 초과로 데이터를 전송하는 것입니다. 이 적용되지 않는 경우 이러한 구성을 노출하지 않습니다 사용하고있는 API가, 두 번째 가장 좋은 방법은 인터럽트 API를 사용하는 것 때문에
try {
mySendingDataLibraryApi.sendData(data, timeout /*, timeUnit */);
// some new APIs enable also to configure the time unit of the required timeout.
// Older APIs typically just use milliseconds.
} catch (TimeoutException e) {
doCleanup(); // your cleanup method.
}
(2)
처럼 보일 것이다 sendData
메서드를 호출하고 실행 스레드를 인터럽트합니다. 이는 이러한 인터럽트 가능한 API가 제공된다는 사실에 의존합니다.
class MySendingDataRunnable implements Runnable {
@Override
public void run() {
try {
mySendingDataLibraryApi.sendDataInterruptibly(data);
} catch (InterruptedException e) {
doCleanup(); // your cleanup method.
// here either re-throw InterruptedExecption
// or restore the interrupted state with Thread.currentThread().interrupt();
}
}
}
: 시간 형 방법은 API가 제공되지 않은 경우 나는 이러한 방법의 존재에 많이 포함되지 것입니다 ... 어쨌든, 작업을 실행하는 스레드의 코드는 같을 것이다
final ExecutorService executor = Executors.newSingleThreadExecutor();
final Future<?> future = executor.submit(new MySendingDataRunnable());
try {
final Object noResult = future.get(60, TimeUnit.SECONDS); // no result for Runnable
} catch (InterruptedException e) {
// here again either re-throw or restore interupted state
} catch (ExecutionException e) {
// some applicative exception has occurred and should be handled
} catch (TimeoutException e) {
future.cancel(true); // *** here you actually cancel the task after time is out
}
(3 : 호출자의 코드는 스레드, true
로 설정 mayInterruptIfRunning
인수 작업을 원하는 시간을 기다린 취소하기 위해, 자사의 Future<?> submit(Runnable task)
방법 리턴 한 ExecutorService과 Future 인스턴스를 사용한다)
사용하는 API가 이러한 기능 (시간 지정/중단 방법)을 제공하지 않는 경우 창의력을 사용해야합니다! 이 한 줄의 코드를 차단하려면 일부 리소스에서 을 차단해야합니다. 이 자원에 접근하여 종료하거나 종료하여 암시 적으로 작업이 종료되도록하십시오.일반적인 예는 네트워크 연결을 닫는 것입니다.
참고 : 위의 솔루션은 실제로 작업을 취소하고 추가 작업에 대한 스레드를 확보하는 방법을 제공합니다. 스레드가 여전히 살아있을 수 있습니다. 스레드를 죽이는 것은 일반적으로 작업이 완료되거나 실패 할 때 수행하는 작업이 아닙니다. 다시는 실행되지 않아야 할 특정 작업에 대한 스레드를 만들었 으면 좋을 것입니다. 그러한 경우 위의 ExecutorService
을 사용하고 해당 shutdownNow()
메소드를 호출합니다. 그리고 심지어 shutdownNow()
에만 최선의 노력을하고 일반적으로 인터럽트 될하기 위해 실제 작업에 따라 달라집니다 ...
Here's a detailed article (그럼에도 불구하고 다소 오래된하지만).
이 스레드에는 최상위 루프가 있습니까? 스레드가 멈추더라도 반복적으로 도달하는 코드가 있습니까? 스레드가 작동하기 전에 얼마나 많은 시간 동안 루프가 반복되는지 예측할 수 있습니까? –
이상적으로, 스레드가 주기적으로 검사하는 플래그가 있어야합니다. 플래그가 설정되어 있으면 스레드가 순서대로 작업을 종료해야합니다. – Aurand
루프 등이 없습니다. 스레드가 데이터를 보내지 만 데이터를 보내는 데 너무 오래 걸리는 경우 종료해야합니다. 한 줄의 코드에 붙어 있으면 주기적으로 검사 할 수 있습니까? – user760220