首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Thread.interrupt()抛出IllegalThreadStateException?

为什么Thread.interrupt()抛出IllegalThreadStateException?
EN

Stack Overflow用户
提问于 2011-12-28 09:51:55
回答 1查看 318关注 0票数 0

请解释一下为什么下面的代码会抛出IllegalThreadStateException?

代码语言:javascript
复制
try
{
    if(thread1 != null)
    {
        if(thread1.isAlive()); 
        {
            thread1.interrupt();   //it is ok
            thread1.join();
        }
    }
    if(thread2 != null)
    {
        if(thread2.isAlive());
        {
            thread2.interrupt(); //throw IllegalThreadStateException
            thread2.join();
        }
    }
}
catch(IllegalThreadStateException e)
{
    System.exit(0);
}

当运行语句thread2.interrupt()时抛出IllegalThreadStateException。但是thread1.interrupt()是可以的。

请给我解释一下。

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-28 10:07:41

这行代码:

代码语言:javascript
复制
if(thread2.isAlive()); // <-- Note this semicolon well!

不是在做你认为它在做的事情:-)代码段:

代码语言:javascript
复制
if(thread2.isAlive());
{
    thread2.interrupt(); //throw IllegalThreadStateException
    thread2.join();
}

将检查线程是否处于活动状态,如果是,则在分号之前执行该空语句。然后,无论线程处于什么状态,它都会在大括号内执行interrupt/join序列。这是因为:

代码语言:javascript
复制
{
    doSomething();
}

是一个完全有效的Java构造,即使前面没有ifwhile。更改:

代码语言:javascript
复制
if(thread2.isAlive());

至:

代码语言:javascript
复制
if(thread2.isAlive())

(对thread1检查也执行同样的操作)。

您还应该对异常调用getMessage(),以找出具体的详细信息。

它可能包含额外的信息,以便更容易地进行根本原因分析。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8651064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档