Tah*_*her 4 java multithreading
我正在尝试终止一个线程,但它不会中断或停止。所有这些都是名为 Webots 的软件的控制器的一部分。我用它来模拟多机器人系统。在每个机器人的控制器中,我启动一个线程,通过机器人接收器接收消息。该线程必须首先启动,并在模拟结束时终止。
该线程的 run 方法如下所示:
public void run() {
while (true)
{
String M = recieveMessage();
char[] chars = M.toCharArray();
if(chars[0]==robotName||chars[0]=='0')
messages.add(M);
}
}
Run Code Online (Sandbox Code Playgroud)
在主控制器中,我的代码如下所示:
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());
Run Code Online (Sandbox Code Playgroud)
我在主控制器中做什么并不重要,所以不要评判它。例如,消息是一个 ArrayList。它就像一个缓冲区,MT 将消息放入其中,主线程从中读取。我使用它是因为接收器和发射器不同步。
如果我调用interrupt() 或MT = null 但interrupted() 它返回false 并且MT 继续运行。我的代码有什么问题吗?
我阅读了一些主题,例如:
http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html
等等,但我找不到任何有用的答案。
谢谢大家,我已经对我的代码进行了更改。我将此添加到 MessageThread 类:
private volatile boolean isRunning = true;
Run Code Online (Sandbox Code Playgroud)
然后我使用了while(isRunning)而不是while(true)我添加了
public void kill()
{
isRunning = false;
}
Run Code Online (Sandbox Code Playgroud)
并调用MT.kill()而不是MT.interrupt().
它有效,但我无法找出中断()有什么问题。我阅读了@ExtremeCoders 推荐的链接。但是,我仍然很困惑。它说“一个线程必须支持它自己的中断”。那么我必须覆盖interrupt()方法吗?我不能调用中断来终止线程?
再次感谢。
中断线程只是在线程上设置一个标志。如果线程从不检查标志,它就不会响应。通过创建您自己的boolean成员,您不必要地重复了该功能。
这是您尝试执行的操作的一般模式:
@Override
public void run() {
while(!Thread.interrupted() {
/* Do something. */
}
Thread.currentThread().interrupt();
}
Run Code Online (Sandbox Code Playgroud)
这将允许您MT.interrupt()按预期调用。这比创建自己的标志和自定义方法来设置它更好:您可以将您的Runnable任务与高级工具一起使用,ExecutorService并且取消将起作用,因为您使用了标准 API;中断整个ThreadGroup.
调用Thread.interrupted()清除线程的中断状态;我们通过调用设置它Thread.currentThread().interrupt(),再次设置状态,以便调用者run()可以检测到中断状态。然而,这可能并不总是可取的。
| 归档时间: |
|
| 查看次数: |
9331 次 |
| 最近记录: |