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;
    }
}
4

5 回答 5

2

不会使用 aboolean检查线程是否应该终止。如果您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,可以清除当前线程的中断状态。

于 2012-07-05T22:47:18.077 回答
1

你想打电话thread.start();,不是thread.run();。run() 不会分叉。

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

于 2012-07-04T01:21:46.687 回答
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();
于 2012-07-04T02:31:29.417 回答
0

您的简化代码中提出的技术应该可以工作。我至少可以确认它可以在我的桌面上运行。你在本地测试过简化版吗?可能在您的实际版本中发生了一些未在此处表示的事情,例如使用非静态变量或还必须满足的附加条件。

于 2012-07-04T03:21:13.780 回答
0

我相信您可能想考虑使用Thread.interrupt(). Java 教程中有一篇关于它的好文章。

建议布尔标志的答案同样正确。无论哪种情况,您都将在某处检查一些条件语句以查看您的线程是否应该终止。终止的条件可能是线程被中断或设置了它的布尔标志(取决于您选择的实现)。

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

于 2012-07-04T06:25:28.130 回答