gpt4 book ai didi

java - Java多线程,但只有一个线程工作

转载 作者:行者123 更新时间:2023-11-30 06:12:41 26 4
gpt4 key购买 nike

我的 Java 线程无法独立工作,如何解决?这是最初的主要内容:

Mechanics mechanics = new Mechanics(busShop, "Mechanic 1");
Mechanics mechanics2 = new Mechanics(busShop, "Mechanic 2");

Thread thMechanic = new Thread(mechanics);
Thread thMehanic2 = new Thread(mechanics2);

thMechanic.start();
thMehanic2.start();

到目前为止没有问题,按预期工作,因此机制会这样做:

public void run() {
fixEngine();
}

private void fixEngine() {
while (true) {
busShop.FixEngine(MechanicsName);
}
}

如此处所示,它可以永久修复引擎,在修复引擎功能内部:

public static List<Bus> ListBusEngineFix = new LinkedList();

public void FixEngine(String mechanicsName) {
Bus bus;

synchronized (ListBusEngineFix) {
System.out.println("Working Thread: " + Thread.currentThread().getName());
while (ListBusEngineFix.size() == 0) {
try {
ListBusEngineFix.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//Wait for notify if empty

try {
Thread.sleep(10000);

} catch (InterruptedException e) {
e.printStackTrace();
}
//IF EACH THREAD RUNS INDEPENDENTLY IT WILL BT ONLY LESS THAN 20 SECONDS
//BUT THIS CASE, MY PROGRAM WAIT FOR PREVIOUS THREAD, WHICH CAUSE MORE THAN 20 SECONDS.
}

结果:

Working Thread: Thread-6
Working Thread: Thread-7

两个线程都按预期运行

前 10 秒:

Bus: Bus 1by Mechanic 1

再过 10 秒:

Bus: Bus 2by Mechanic 1

我怀疑机械师 1(线程)会锁定自己,因此机械师 2(线程)无法帮助它,因为机械师 1 会完成所有任务。无论如何,如何解决它?

注意:我只在早期的for wait(用于通知)中使用synchronized,如果不使用会出现网络监控异常。

编辑:添加了 LinkedList 和 Notify 以进行澄清,提供的所有列表都是链接列表。一个类。

编辑2:好吧,我已经修复成这样:

synchronized (ListBusDepotWaiting) {
while (ListBusDepotWaiting.size() == 0) {
try {
ListBusDepotWaiting.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

//Engine not yet fixed
//Notify the Mechanics to fix car
if (ListBusEngineFix.size() < 2) {
//Means that mechanics is empty
bus = (Bus) ((LinkedList<?>) ListBusDepotWaiting).poll();
((LinkedList<Bus>) ListBusEngineFix).offer(bus);
if (ListBusEngineFix.size() == 1) {
synchronized (ListBusEngineFix) {
ListBusEngineFix.notify();
}
}

}

现在他们可以打电话通知了,但是原来的问题仍然存在,无法给Mechanic2工作

最佳答案

waitnotify应该在同一个monoror对象上执行。

在您的代码中,您正在等待

ListBusEngineFix.wait();

同时通知

BusShop.ListBusDepotWaiting.notify();

因此等待线程将被阻塞。

关于java - Java多线程,但只有一个线程工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49893455/

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