我有以下任务类,它将 http 请求发送到 API。如果该过程花费太长时间,我想通过调用 stop 函数来终止线程,但它不起作用。
class Task implements Runnable{
private final AtomicReference<Thread> currentThread = new AtomicReference<Thread>();
private String bid;
private long id;
public Task(String bid, long id) {
this.bid = bid;
this.id = id;
}
@Override
public void run() {
currentThread.set(Thread.currentThread());
// send http request
String result = service.checkPaymentState(id, bid);
}
public void stop() {
System.out.println("stop!!!");
currentThread.get().interrupt();
}
}
主要方法。如果任务在 2 秒内未完成,则应取消任务:
Task task = new Task(bid, id);
Future future = taskScheduler.submit(task);
scheduledExecutorService.schedule(() -> {
if (!future.isDone()) {
System.out.println("Cancelled!");
future.cancel(true);
task.stop();
}
}, 2, TimeUnit.SECONDS);
最佳答案
从 ThreadPool 获取的中断线程 - 是个坏主意 - 你不知道线程池中断策略。有一天,您可以将线程池的实现更改为不创建新线程的实现 - 当某些工作线程被中断并终止时 - 最终您将耗尽线程池中的线程。
首选方式是调用future.cancel(true);
- 您将得到InterruptedException
- 长时间运行的 HTTP 请求。
注意:不要捕获 InterruptedException
并吞下 - 让它在线程池级别进行处理并应用中断策略。或者,如果吞下它 - 通过 Thread.currentThread().interrupt()
在线程上手动设置中断标志
关于java - 如何终止发送长时间运行的 HTTP 请求的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53779446/