如何让这个线程停止

时间:2012-07-04 01:20:30

标签: java multithreading

所以这是我的问题,我怎么能让线程停止,我对线程不是很精通,但我读过的小信息告诉我这应该有效。

public class testestes {
    static volatile boolean key;

    public static void main (String []args)
    {
        key=true;
        Thread thread=new Thread(new Runnable()
        {
            public void run()
            {
                while(key)
                {
                    System.out.println("running");
                }
            }
        });

        thread.start();
        key=false;
    }
}

5 个答案:

答案 0 :(得分:2)

不会使用boolean检查线程是否应终止。如果你使用volatile作为字段修饰符,这将是可靠的,但如果你的代码变得更复杂,而是使用while循环内的其他阻塞方法,可能会发生,你的代码会<强烈>不终止或者至少需要更长时间

  

某些阻止库方法支持中断。

每个线程都有一个布尔标志中断状态,你应该使用它。它可以像这样实现:

public void run() {

   try {
      while(!Thread.currentThread().isInterrupted()) {
         // ...
      }
   } catch (InterruptedException consumed)
      /* Allow thread to exit */
   }

}

public void cancel() { interrupt(); }

源自Java Concurrency in Practice的源代码。由于cancel()方法是公共的,您可以让另一个线程根据需要调用此方法。

还有一个命名不佳的静态方法interrupted,它清除了当前线程的中断状态。

答案 1 :(得分:1)

您想拨打thread.start();,而不是thread.run();。 run()不会fork。

此外,可能会出现这样的情况:您不会看到任何“正在运行”的输出,因为您在分叉后立即将key设置为false,因此当分叉线程进入run()时,key已经错了。

答案 2 :(得分:0)

执行此操作的基本布局实际上是一个实现Runnable的类。

public class SampleThread implements Runnable
{
  private volatile boolean stopFlag = false;

  public void stopThisThread()
  {
    stopFlag = true;
  }

  public void run()
  {
    while (!stopFlag)
    {
      //doStuff
    }
  }
}

然后在其他地方

SampleThread sample = new SampleThread();
new Thread(sample).start();
//Then when you want to kill it...
sample.stopThisThread();

答案 3 :(得分:0)

您的简化代码中提出的技术应该有效。我至少可以确认它在我的桌面上有效。您是否在本地测试了简化版本?也许你的实际版本中有些东西在这里没有被表示,比如使用非静态变量或者必须满足的附加条件。

答案 4 :(得分:0)

我相信你可能想看看用Thread.interrupt()打断线程。 Java教程中有一篇关于它的好文章。

建议布尔标志的答案同样正确。在任何一种情况下,你都要检查一些条件语句,看看你的线程是否应该终止。终止的条件可能是线程被中断或其布尔标志已设置(取决于您选择的实现)。

最后一句警告:永远不要使用Thread.stop()。它被推荐是有充分理由的。有关详细说明,请参阅here