所以这是我的问题,我怎么能让线程停止,我对线程不是很精通,但我读过的小信息告诉我这应该有效。
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 :(得分: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。