下面的代码在我的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();
}
}
首先,suspend
和resume
不推荐使用,编译器告诉您不要使用它们。非常突然。
现在,您正在以尽可能快的速度通过“循环”向控制台发送垃圾邮件,因此“恢复”会被从屏幕上发送垃圾邮件。所以你永远看不到它,它离开了控制台的缓冲区。
如果我注释掉“循环”的打印,或者以500毫秒的间隔打印,我就可以看到“恢复”。
问题内容: 我正在尝试的代码 我们如何根据其ID暂停/暂停线程?Thread.suspend已过时,必须有一些替代方法来实现。我有线程ID,我想挂起并杀死线程。 编辑:我用这个。 但是我无法停止该线程。 问题答案: 这些天杀死线程的正确方法就是使用它。这集真和原因,以及一些其他的方法来扔。 在线程代码内部,您应该执行类似以下的操作,检查以确保它没有被中断。 这是一个如何在线程内部处理中断异常的示例
问题内容: 与此问题相关,我有以下代码可订阅redispubsub队列,并使用__init__中提供的处理程序将消息提供给处理它们的类: 在上面的链接问题中,请注意,如果断开连接,则永不返回。因此,尽管我的函数可以被调用,但它实际上不会导致线程终止,因为它挂在对线程内部的调用上。 链接问题的可接受答案提到了黑客入侵redis-py的连接池。我真的不想这样做,并且有一个分支版本的redis- py(
当为
问题内容: 我有一个简单的JavaFX 2应用程序,带有2个按钮,分别是“开始”和“停止”。单击开始按钮后,我想创建一个后台线程,该线程将进行一些处理并随着时间的推移更新UI(例如进度条)。如果单击停止按钮,我希望线程终止。 我尝试使用从文档中收集的类来完成此操作。但是,每当我单击“开始”时,UI就会冻结/挂起,而不是保持正常。 她是来自主类的用于显示按钮的代码: 这是类的代码: 相当简单,但是每
问题内容: 我在Oracle Java教程中遇到了这个示例,该示例描述了多线程场景中的死锁。 因此,在此示例中,我在第17行和第18行进行了以下更改。 完成这些更改后,程序将成功终止,而不会导致死锁,并在输出后进行打印 所以我的问题是-为什么会这样表现?println语句如何防止死锁? 问题答案: 无论您使用还是,都没有什么区别:它们基本上是在做同一件事。 如果在和的开始之间开始执行,则在此处发生
问题内容: 如果多个线程在不同步的情况下调用System.out.println(String),输出是否可以交错?还是每行的写入都是原子的?该API只字不提同步的,所以这似乎是可能的,或者是由交错缓冲和/或虚拟机存储器模型等防止输出? 编辑: 例如,如果每个线程包含: 保证输出是: 或者可能是: 问题答案: 由于API文档没有提及System.out对象的线程安全性,因此该PrintStream