2012-07-04 104 views
0

所以这是我的问题,我怎样才能使线程停止,我不是线程很精通,但我看了一些信息告诉我,这应该工作。我怎样才能让这个线程停止

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; 
    } 
} 
+0

我试过你的代码,它停下来。 –

+0

我也不明白,一旦调用'run()'变为'start()',新线程运行,当键设置为false时,新**线程停止**。该代码适用于我。问题必须出现在此处未发布的代码中。 –

回答

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

我最终使用这种解决方案,虽然这不是我最初的问题的答案,这是我的问题的实际答案,它似乎是最好的选择。 (我发誓,在我的电脑中,代码片段并没有停止,我仍然不知道为什么)。 – crusader

1

您想致电thread.start();而不是thread.run();。 run()不会分叉。

此外,它可能会是,你不会看到任何“跑”的输出,因为你马上设置key为false,叉所以当分叉线程进入后run()key已经是虚假的情况。

+0

我的问题是,我无法停止输出显示,我想停止线程不让它运行。 – crusader

+0

@crusader当你调用'thread.start()'而不是'thread.run()'时,你不能停止输出显示? –

+0

如果你想停止整个事情(JVM),你可以调用System.exit,但我不确定这是否是你想要的解决方案。 – Joset

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(); 
0

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

0

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

提示有布尔标志的答案是同样正确。无论哪种情况,你都要检查某个条件语句,看看你的线程是否应该终止。终止的条件可能是线程被中断或其布尔标志被设置(取决于您选择的实现)。

警告的最后一句话:永远不要使用Thread.stop()。它有一个很好的理由被弃用。请参阅here以获得很好的解释。