【问题标题】:How to stop a Java thread? [duplicate]如何停止 Java 线程? [复制]
【发布时间】:2012-10-11 08:11:15
【问题描述】:

可能重复:
How do you kill a thread in Java?
How to start/stop/restart a thread in Java?

Thread具有以下功能:

  • destroy()
  • stop()
  • suspend()

但它们都已被弃用。
你用什么来停止线程?

【问题讨论】:

  • 你不要停止线程,只需让run方法完成它的执行。
  • 您能否详细说明您为什么要停止线程的用例?
  • 为了完整起见,另一种方法是终止整个过程 - 这将起作用。
  • 在线程外部或线程中的字段上设置一个标志,并在标志变为真时让线程检查。当它发生时,使 run 方法返回。设置标志以使线程自行退出。简单

标签: java multithreading


【解决方案1】:

你应该确保它只是在它应该运行的时候运行/退出。

查看this 以获得解释。

【讨论】:

    【解决方案2】:

    您可以使用布尔标志来停止线程。您也可以使用Thread.isInterrupted() 来检查线程是否被中断并忽略与布尔标志相同的其余工作。

    class Worker implements Runnable {
        private volatile boolean shouldRun = true;
    
        @Override
        public void run() {
            while (shouldRun) {
                // your code here
            }
        }
    
        public void cancel()
        {
            shouldRun = false;
        }
    }
    

    如果您想知道为什么不推荐使用这些功能,可以查看Java Thread Primitive Deprecation

    【讨论】:

      【解决方案3】:

      你可以这样做:

      private boolean running = true;
      
      public void stop () {
          running = false;
      }    
      
      public void run () {
          while (running) { 
              //your code goes here
          }
      }
      

      这只是让 run-method 消失的简单方法。

      【讨论】:

      • +1 运行需要volatile 否则 run() 可能永远不会停止。
      【解决方案4】:

      你礼貌地请他结束工作。该线程应该表现良好,并且应该在被询问时结束它的工作。

      问你使用Thread.interrupt(),它会抛出InterruptedException(如果线程正在等待)或在线程中设置一个标志(如果不等待)。

      线程应该在捕获InterruptException 时退出它的工作,或者如果它做了很多长时间的工作(没有睡眠/等待),它应该不时检查它是否被中断并退出。

      【讨论】:

        【解决方案5】:

        您提到的方法已被弃用,因为一旦使用它们可能会使系统进入不稳定状态:就像杀死进程一样。使用这些方法不会给线程任何优雅退出的机会。

        结论是,您正在实现的每个线程都应该有自己的优雅退出机制。通常,您执行以下操作。创建boolean 标志exit,默认为false。线程的run() 方法应该实现如下循环:

        while (!exit) {
            // do the job
        }
        

        添加方法exit() 将此标志转换为true,因此当从线程外部调用该方法时,将在下一次迭代中离开while 循环。您应该在退出时关心关闭资源等。

        显然你可以通过发送 sing 来改进机制

        【讨论】:

          【解决方案6】:

          任何线程都会运行以完成其工作。它应该确定自己是否还有更多工作要做。当您想停止一个工作线程时,这意味着该线程认为该工作存在,但您不希望该线程执行它。这绝对是您设计中的一个问题。在一个好的设计问题中,不需要停止/恢复线程。

          【讨论】:

            猜你喜欢
            • 2013-11-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-22
            • 2013-09-24
            相关资源
            最近更新 更多