多线程 Java,但只有一个线程在工作
Multi Thread Java, but only one thread working
我的 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
我怀疑是 Mechanic 1(线程)锁定了自己,以至于 Mechanic 2(线程)无法帮助它,因为 Mechanic 1 完成了所有任务。无论如何,如何解决它?
注意:我前期只用synchronized等待(通知),不放会网络监听异常
编辑:添加了 LinkedList 和 Notify 以进行说明,所有提供的列表都是链接列表。一个 Class.
编辑 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
工作
wait
和notify
应该在同一个monotor对象上执行。
在您的代码中,您正在等待
ListBusEngineFix.wait();
而 notify
通过
BusShop.ListBusDepotWaiting.notify();
所以等待线程会被阻塞
我的 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
我怀疑是 Mechanic 1(线程)锁定了自己,以至于 Mechanic 2(线程)无法帮助它,因为 Mechanic 1 完成了所有任务。无论如何,如何解决它?
注意:我前期只用synchronized等待(通知),不放会网络监听异常
编辑:添加了 LinkedList 和 Notify 以进行说明,所有提供的列表都是链接列表。一个 Class.
编辑 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
wait
和notify
应该在同一个monotor对象上执行。
在您的代码中,您正在等待
ListBusEngineFix.wait();
而 notify
通过
BusShop.ListBusDepotWaiting.notify();
所以等待线程会被阻塞