java - 如何终止发送长时间运行的 HTTP 请求的线程?

标签 java multithreading

我有以下任务类,它将 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/

相关文章:

c++ - 可以在从 Thread 类继承的对象上使用 "delete this;"吗?

.net - 在 .NET 中的 Azure 辅助角色中使用 Thread.Sleep 或 Timer?

java - Spring 异步和分时度假

java - 在.txt文件java中的不同行中写入问题

java - 以编程方式禁用 Android 中的所有声音和振动

java - 创建 URL 中定义的名称为 'repositorySearchController' 的 bean 时出错

python多线程服务器

java - 当我尝试使用调度程序自动发送邮件时,默认 session 的访问被拒绝

java - 在 Java 中进行 SELECT 和比较或 DELETE 和 INSERT 更有效

Java并发唤醒线程