gpt4 book ai didi

java - 如何解决这个线程阻塞问题

转载 作者:行者123 更新时间:2023-12-01 19:05:53 25 4
gpt4 key购买 nike

我正在测试Java多线程示例代码,但在qB.start()的for循环中启动的线程被阻塞,因为它正在等待qB监视器的进入。造成这种堵塞的原因是什么?

谢谢。

import java.util.*;

class QA {

public synchronized void open() throws Exception {

Thread o = new Thread() {

public void run() {

QB qB = new QB();

qB.start();
}
};

o.start();
}

public static void main(String args[]) throws Exception {

new QA().open();
}

public class QB {

private boolean shutdown;
private Vector<Thread> tList;
private final Object waitingLock = new Object();

public QB() {

tList = new Vector<Thread>();
}

public synchronized void start() {


for(int i = 0; i < 1; i++) {

final int id = i;

Thread t = new Thread("Thread " + id) {

public void run() {

load(id);
}
};

tList.add(i, t);

t.start();

}

tMonitor();
waitUntilFinished();
}

private void tMonitor() {

Thread cmt = new Thread("T Monitor Thread") {

public void run() {

synchronized(waitingLock) {

while(tList.size() > 0) {

try {

sleep(10000);

} catch(Exception e) {

e.printStackTrace();
}
}

waitingLock.notifyAll();
}
}
};

cmt.start();
}

private void waitUntilFinished() {

synchronized(waitingLock) {

while(!isShutDown()) {

try {


waitingLock.wait();


} catch(Exception e) {

e.printStackTrace();
}
}
}

}

private synchronized void load(int id) {

try {

System.out.println("blocked here");

// some work done here

removeFromTList(id);


} catch(Exception e) {

e.printStackTrace();
}
}


public synchronized boolean isShutDown() {

return shutdown;
}
}
}

最佳答案

我看到的第一个问题是 QB#start()QB 实例上同步。在您尝试生成的线程 t 内,load(id) 也在同一个 QB 实例上同步。因此,当您调用 t.start() 时,t 线程会阻塞,直到 QB#start() 完成。

据推测,在 QB#start() 方法结束时,QB#waitUntilFinished() 应该等待所有 t 线程完成,但它们甚至无法进入 QB#load 方法,因为它们仍在等待 QB#start() 方法释放锁QB 实例。

所以,循环死锁。

关于java - 如何解决这个线程阻塞问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10114695/

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