gpt4 book ai didi

java - System.out.println 和挂起线程的死锁

转载 作者:行者123 更新时间:2023-11-29 02:58:36 25 4
gpt4 key购买 nike

以下代码导致我的 OSX Mavericks 出现死锁,我没有看到打印的“resuming”字符串,因此预计这就是原因。我明白suspend、resume可能会导致死锁,但没想到这么简单。

有什么明显的原因吗?

Java 版本Java 版本“1.8.0_66”Java(TM) SE 运行时环境(build 1.8.0_66-b17)Java HotSpot(TM) 64 位服务器 VM(构建 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();
}
}

最佳答案

刚刚看了一本书,知道为什么死锁了。System.out.println()方法是一个synchronized方法,下面是它的代码:

/**
* Prints a String and then terminate the line. This method behaves as
* though it invokes <code>{@link #print(String)}</code> and then
* <code>{@link #println()}</code>.
*
* @param x The <code>String</code> to be printed.
*/
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}

所以当线程 t 处于suspending 时,它可能会遇到 println 方法,并锁定 PrintStream 实例,所以当主线程运行System.out.println("resuming");,主线程会被阻塞。将您的代码更改为:

    //System.out.println("resuming");
t.resume();
Thread.sleep(2000);
t.interrupt();
System.out.println("end");

你会正常的,希望能帮到你。

关于java - System.out.println 和挂起线程的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36631153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com