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

System.Out.PrintLn和挂起的线程出现死锁

轩辕阳焱
2023-03-14

下面的代码在我的OSX小牛上造成了死锁,我没有看到“replesting”字符串打印出来,所以我认为这是原因。我理解挂起、恢复可能会导致死锁,但没想到这么简单就能达到。

有什么明显的原因吗?

Java版本Java版本“1.8.0_66”Java(TM)SE运行时环境(build 1.8.0_66-B17)Java HotSpot(TM)64位服务器VM(build 25.66-B17,混合模式)

class TestThread {
    public static void main(String args[]) throws InterruptedException {
        Thread t = new Thread() {
            public void run() { 
                while (!isInterrupted()) { 
                    System.out.println("looping");
                }
            }
        };

        t.start();
        Thread.sleep(1000);
        t.suspend();
        Thread.sleep(5000);
        System.out.println("resuming");
        t.resume();
        Thread.sleep(2000);
        t.interrupt();
    }
}

共有1个答案

巫马庆
2023-03-14

首先,suspendresume不推荐使用,编译器告诉您不要使用它们。非常突然。

现在,您正在以尽可能快的速度通过“循环”向控制台发送垃圾邮件,因此“恢复”会被从屏幕上发送垃圾邮件。所以你永远看不到它,它离开了控制台的缓冲区。

如果我注释掉“循环”的打印,或者以500毫秒的间隔打印,我就可以看到“恢复”。

 类似资料:
  • 问题内容: 我正在尝试的代码 我们如何根据其ID暂停/暂停线程?Thread.suspend已过时,必须有一些替代方法来实现。我有线程ID,我想挂起并杀死线程。 编辑:我用这个。 但是我无法停止该线程。 问题答案: 这些天杀死线程的正确方法就是使用它。这集真和原因,以及一些其他的方法来扔。 在线程代码内部,您应该执行类似以下的操作,检查以确保它没有被中断。 这是一个如何在线程内部处理中断异常的示例

  • 问题内容: 与此问题相关,我有以下代码可订阅redispubsub队列,并使用__init__中提供的处理程序将消息提供给处理它们的类: 在上面的链接问题中,请注意,如果断开连接,则永不返回。因此,尽管我的函数可以被调用,但它实际上不会导致线程终止,因为它挂在对线程内部的调用上。 链接问题的可接受答案提到了黑客入侵redis-py的连接池。我真的不想这样做,并且有一个分支版本的redis- py(

  • 问题内容: 我有一个简单的JavaFX 2应用程序,带有2个按钮,分别是“开始”和“停止”。单击开始按钮后,我想创建一个后台线程,该线程将进行一些处理并随着时间的推移更新UI(例如进度条)。如果单击停止按钮,我希望线程终止。 我尝试使用从文档中收集的类来完成此操作。但是,每当我单击“开始”时,UI就会冻结/挂起,而不是保持正常。 她是来自主类的用于显示按钮的代码: 这是类的代码: 相当简单,但是每

  • 问题内容: 我在Oracle Java教程中遇到了这个示例,该示例描述了多线程场景中的死锁。 因此,在此示例中,我在第17行和第18行进行了以下更改。 完成这些更改后,程序将成功终止,而不会导致死锁,并在输出后进行打印 所以我的问题是-为什么会这样表现?println语句如何防止死锁? 问题答案: 无论您使用还是,都没有什么区别:它们基本上是在做同一件事。 如果在和的开始之间开始执行,则在此处发生

  • 问题内容: 我正在用Java开发多线程游戏。我有几个工作线程,它们从中央线程管理器中获取模块,然后由它自己执行。现在,我希望能够暂停这样的线程,如果它暂时没有任何执行。我试过从线程管理器上调用wait()方法,但这只会导致它忽略紧随其后的notify()调用。 我也在谷歌上搜索了一下,只是发现大多数站点都引用了suspend(),pause()等函数,这些函数现在在java文档页面上已被标记为已弃