当前位置: 首页 > 知识库问答 >
问题:

Thread.Intervicated在java中不起作用

夹谷承安
2023-03-14

我在oracle Docs for java中读到了Thread.interrupted将使线程恢复到non-interprated状态。当线程通过调用静态方法thread.interrupted检查中断时,中断状态将被清除。一个线程用来查询另一个线程的中断状态的非静态isInterrupted方法不会更改中断状态标志。

if(Thread.currentThread().isInterrupted())
                {
                       flag = 999;
                       Thread.currentThread().interrupted();
                       System.out.println("Interruption cleared");
                }

上面的块根本不被调用。

public static void main(String args[]) 
{
    int n = 5;
    int flag = 1;
    for (int i = 0; i < n; i++) 
    {

        try
        {
        System.out.println("i:"+i+":n:"+n+":Thread.currentThread().isInterrupted():"+Thread.currentThread().isInterrupted());           
        Thread.sleep(2000);
        if(i==(flag))
            Thread.currentThread().interrupt();         

        }
        catch(Exception e)
        {
            System.out.println(Thread.currentThread().isInterrupted()+"Exception :"+i);
            if(Thread.currentThread().isInterrupted())
            {
                   flag = 999;
                   Thread.currentThread().interrupted();
                   System.out.println("Interuption cleared");
            }

            System.out.println(Thread.currentThread().isInterrupted()+"Exception :"+i);
            e.printStackTrace();
        }

    }
}

产出:

i:0:n:5:Thread.currentThread().isInterrupted():false
i:1:n:5:Thread.currentThread().isInterrupted():false
i:2:n:5:Thread.currentThread().isInterrupted():true
falseException :2
falseException :2
i:3:n:5:Thread.currentThread().isInterrupted():false
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at leo.threads.InterruptSleepMessages.main(InterruptSleepMessages.java:14)
i:4:n:5:Thread.currentThread().isInterrupted():false

共有1个答案

卢景澄
2023-03-14

我在评论中说的部分是错误的。实际上,Java7文档SAIS:

如果这个线程在对象类的wait()、wait(long)或wait(long,int)方法的调用中被阻塞,或者在该类的join()、join(long)、join(long,int)、sleep(long)或sleep(long,int)方法的调用中被阻塞,那么它的中断状态将被清除,它将收到一个interruptedexception。

来源:http://docs.oracle.com/javase/7/docs/api/java/lang/thread.html#interrupt()

因此,抛出的InterruptedException将清除状态,而不是捕获状态。看到的效果是一样的。当i=1时,标志由interrupt()设置,并执行sleep将导致清除标志并引发异常,从而导致看到的输出。

另见:http://docs.oracle.com/javase/7/docs/api/java/lang/thread.html#sleep(long)

 类似资料:
  • 问题内容: 我有一个带有JFrame的Java程序 我正在使用绝对定位 这是我的主要功能 当我运行程序时,我尝试调整其大小并使窗口变小,但我无法 当我尝试使窗口变大时,它可以正常工作,我基本上会跳过该功能 我已经看过了,显然这已经发生过 这是一个已知的错误? 如果是这样,我听说我可以制造一个Window Listener,当我尝试它时,我实现了WindowListener所需的功能,但找不到任何解

  • 问题内容: 这是我的xml文档。我只想使用xml签名对userID部分进行签名。我正在使用xpath转换来选择该特定元素。 我正在使用以下代码添加转换: 但是我得到以下内容: 因此,我尝试删除xmlns部分。 但是它在整个文档上签名并给出以下消息: 问题是什么? 编辑 正如@JörnHorstmann所说,消息只是一条日志或类似的东西。现在的问题是,即使在给xpath查询后,整个文档也会被签名,而

  • 我在Debian9.0下安装了最新版本的Java、Eclipse和JDK。当我创建JFrame时,会出现一些错误,例如:

  • 问题内容: 我正在研究一个简单的Java聊天客户端gui应用程序。(服务器等由其他人完成)。 这不是一个大项目,但是我唯一的问题是,无论如何尝试调整上述GUI上任何组件的大小,都将无法正常工作。 例如: 不行 谢谢您的帮助。 问题答案: 在Swing中,您有两个用于布局的选项:手动执行所有操作或为您处理。 仅当您不使用时,通话才有效。由于您使用的是A,因此您必须使用其他方式来指定所需的内容。 尝试

  • 这是我的模块信息: 这是我的父gradle构建文件: 这是我的客户端模块构建文件: 我正在尝试获取FXMLLoader的资源,但我根本无法让它工作。我已经挣扎了两个小时,现在我真的很绝望。我尝试了所有可能的文件名组合,每个可能的位置,但仍然返回null。 我还尝试了,但它也不工作。 有人能帮我吗?我将非常感激。

  • 问题内容: 这是用于通过布雷森纳姆算法在计算出的位置上绘制点的代码: 列表“布雷森汉姆”包含所有借助布雷森汉姆线描算法预先计算的点。我想在“ for”循环中设置1秒的延迟,以便在间隔1秒后绘制每个点。“延迟”部分中列出的部分无效。如何使“延迟”工作?更具体地说,我想看到所有的点以1秒的间隔在屏幕上一个接一个地绘制。 问题答案: 我假设您正在某个方法中调用此方法。 只是一个提示: 从来没有睡过油漆过