如何在finally块中使用无限循环停止线程

时间:2014-10-13 10:23:38

标签: java multithreading

抱歉我的英文。

我有一个带方法的线程:

  @Override
  public void run()
  {
    try
    {
      System.out.println( "Hello world" );
      Thread.sleep( 10 );
    }
    catch( InterruptedException e )
    {
      e.printStackTrace();
    }
    finally
    {
      while( true )
        System.out.println( "FINALLYYY" );
    }
  }

我建议,这个帖子永远不能停止! 在调用方法中断或停止后 - 在最后块中线程将启动无限循环。

我如何强制线程停止?

4 个答案:

答案 0 :(得分:1)

线程停止和中断方法不是解决此问题的最佳方法。在线程中添加一个布尔变量,并在while语句中进行检查。

例如:

  private volatile boolean keepGoing = true;

  public void stopTheThread() {
      keepGoing = false;
  }

  @Override
  public void run()
  {
    try
    {
      System.out.println( "Hello world" );
      Thread.sleep( 10 );
    }
    catch( InterruptedException e )
    {
      e.printStackTrace();
    }
    finally
    {
      while( keepGoing )
        System.out.println( "FINALLYYY" );
    }
  }

答案 1 :(得分:1)

所以... 我找到了下一个解决方案:

worker.interrupt();
while( worker.isAlive() )
  worker.stop();

这不是理想的解决方案,但就我而言,它是最好的...... 每次调用worker.stop - 抛出未经检查的异常" ThreadDeath"并且每个最终的区块都会被滑雪" 它应该停止线程。

答案 2 :(得分:0)

在当前设置中,您可以通过调用正在执行的interrupt()上的Thread方法来停止该线程。

无论哪种方式,为了允许Thread正常终止,你必须暴露一种终止该线程的方法,通过暴露线程以便它可以被中断,或者通过提供的方式提供一个'kill switch'。大卫十霍夫。

答案 3 :(得分:0)

  1. 您可以尝试控制用户线程的执行方式(至少在您控制用户线程执行时)。例如,您可以使用并发包中的 Future (不要忘记处理异常):

     ExecutorService executor = Executors.newSingleThreadExecutor();
     Future task = executor.submit(usersThread);
    
     try {
         task.get(1, TimeUnit.MINUTES);
     } finally {
         task.cancel(true);
     }
    
  2. 如果无法控制线程内的代码,则可以控制从中使用的代码。例如,考虑以下方法:

    • 如果您可以在groovy上下文中运行该Thread,那么您可以重新分配从Thread调用的方法。实际上,您可以拒绝所有内容并通过自定义处理程序传递每个调用以获取未知方法。
    • 如果您确定,从线程中调用了什么,那么您可以选择一些劫持(考虑this question中的示例)。