gpt4 book ai didi

Java线程不会停止/中断

转载 作者:搜寻专家 更新时间:2023-11-01 03:06:23 27 4
gpt4 key购买 nike

我正在尝试终止一个线程,但它不会中断或停止。所有这些都是名为 Webots 的软件 Controller 的一部分。我用它来模拟多机器人系统。在每个机器人的 Controller 中,我启动了一个线程,它通过机器人接收器接收消息。该线程必须首先启动,并在模拟结束时终止。

这个线程的运行方法是这样的:

public void run() {
while (true)
{
String M = recieveMessage();
char[] chars = M.toCharArray();
if(chars[0]==robotName||chars[0]=='0')
messages.add(M);
}
}

在主 Controller 中,我有如下代码:

MessageThread MT = new MessageThread(messages, receiver,getName());
MT.start();
for (int i = 0; i < 100; i++)
{
try
{
Thread.sleep(25); } catch (InterruptedException e) { e.printStackTrace(); }
System.out.println(messages.get(messages.size()-1));
}
MT.interrupt();//MT = null;
System.out.println(MT.interrupted());

我在主 Controller 中做什么并不重要,所以不要评判它。例如,消息是一个 ArrayList。它就像一个缓冲区,MT 将消息放入其中,主线程从中读取。我使用它是因为接收器和发射器不同步。

如果我调用 interrupt() 或 MT = null 但 interrupted() 它返回 false 并且 MT 继续运行。我的代码有什么问题吗?

我阅读了一些主题,例如:

http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

How do you kill a Thread in Java?

interrupt() doesn't work

Java: How interrupt/stop a thread?

等等,但我找不到任何有用的答案。

编辑

谢谢大家,我已经修改了我的代码。我将其添加到 MessageThread 类中:

private volatile boolean isRunning = true;

然后我使用 while(isRunning) 而不是 while(true) 并且我添加了

public void kill()
{
isRunning = false;
}

并调用了 MT.kill() 而不是 MT.interrupt()

它有效,但我无法找出 interrupt() 有什么问题。我阅读了@ExtremeCoders 推荐的链接。但是,我仍然很困惑。它说“一个线程必须支持它自己的中断”。那么我是否必须覆盖interrupt() 方法?我不能调用中断来终止线程吗?

再次感谢。

最佳答案

中断线程只是在线程上设置一个标志。如果线程从不检查标志,它就不会响应。通过创建您自己的 boolean 成员,您不必要地复制了该功能。

这是您尝试执行的操作的一般模式:

@Override
public void run() {
while(!Thread.interrupted() {
/* Do something. */
}
Thread.currentThread().interrupt();
}

这将允许您按预期调用 MT.interrupt()。这比创建您自己的标志和自定义方法来设置它更好:您可以将 Runnable 任务与 ExecutorService 等高级工具一起使用,取消将起作用,因为您使用了标准应用程序接口(interface);整个 ThreadGroup 的中断也是如此。

调用Thread.interrupted()清除线程的中断状态;我们通过调用 Thread.currentThread().interrupt() 来设置它,再次设置状态,以便 run() 的调用者可以检测到中断状态。然而,这可能并不总是可取的。

关于Java线程不会停止/中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20817980/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com