有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程如何杀死java线程?

我在谷歌上搜索了杀死java线程的解决方案。有两种解决方案:

  1. 立旗
  2. 使用线程。打断

但这两种都不适合我。在我的线程中,我调用了一个需要很长时间才能完成的第三方api。我想让用户取消这个线程,如果它需要太多时间

那我怎么才能杀死这根线呢?提前谢谢


共 (6) 个答案

  1. # 1 楼答案

    理论上,您可以调用不推荐使用的Thread.stop()方法。但请注意,这可能会导致应用程序以意外和不可预测的方式运行。。。这取决于第三方库实际上在做什么Thread.stop()和朋友基本上是不安全的

    最好的解决方案是修改第三方库以响应线程。打断如果你做不到,那就放弃它,找一个更好的图书馆

  2. # 2 楼答案

    您可以在Thread对象上调用stop方法,但强烈建议您不要这样做

    您是否有对API进行微小更改的自由?这个阻塞调用是CPU绑定还是IO绑定?如果它是IO绑定的,并且您可以访问底层套接字/远程通信对象,那么关闭该对象可以带来奇迹。至少比停止线程要好

  3. # 3 楼答案

    Thread.interrupt()是唯一普遍适用的安全方法。当然,您可以使用其他应用程序级别的信号(例如对易失性变量的条件检查)来自行终止。其他方法(例如所有不推荐的Thread.xx方法)可能会以不确定的方式污染应用程序的状态,并且需要重新加载所有应用程序状态

  4. # 4 楼答案

    生成一个单独的进程,并使用操作系统设施杀死它。你必须调用“C”来完成这项工作,但代码不多。你没有说你在运行什么操作系统

  5. # 5 楼答案

    你可以试试Thread.stop(),但是at your own risk。最理想的情况是,如果需要,您正在调用的API应该有一种中断操作的方法(这就是Thread.interrupt()的作用,如果API本身没有提供一种更干净的方式来中断其进程,您尝试过吗?)

  6. # 6 楼答案

    我会将调用一个需要很长时间的第三方api放入一个Callable<DataTypeReturnedBy3rdPartAPI>中,然后用一个指定超时的SingleThreadExecutor来执行它

    按照这种方法,如果调用第三方API的时间超过^{,线程将被杀死,下面是一些代码来举例说明我所说的:

    ExecutorService executor = Executors.newSingleThreadExecutor();
     try {
       //================= HERE ==================
       Future<Boolean> job = executor.submit(thirdPartyCallable);
       executor.awaitTermination(timeOut, TimeUnit.SECONDS);      
       if(!job.isDone())
         logger.debug("Long call to 3rd party API didn't finish");
       //=========================================
     } catch (Exception exc) {
         exc.printStackTrace();      
     } finally {
         if(!executor.isShutdown() )
           executor.shutdownNow();
     }
    
    }  
    
    private static Callable<Boolean>  thirdParytCallable = new Callable<Boolean>() {
      public Boolean call() throws Exception {
        //Call to long 3rd party API
        //.......
        for(long i = 0;i<99999991999999L;i++) {
          Thread.sleep(10L);// Emulates long call to 3rd party API
          System.out.print(".");
        }
        return Boolean.valueOf(true);//Data from 3rd party API
      }
    };