multithreadingJava,但只有一个线程工作
我的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); } }
正如此处所见,它可以永久修复引擎,在修复引擎function中:
public static List 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完成所有任务。 无论如何,如何解决它?
注意:我只在早期使用synchronized进行等待(用于通知),如果我不放它会有网络监控exception。
编辑:添加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) ListBusEngineFix).offer(bus); if (ListBusEngineFix.size() == 1) { synchronized (ListBusEngineFix) { ListBusEngineFix.notify(); } } }
现在他们可以现在打电话和通知,但原来的问题仍然存在,无法向Mechanic2
提供工作
wait
和notify
应该在同一个monotor对象上执行。
在您的代码中,您正在等待
ListBusEngineFix.wait();
同时notify
BusShop.ListBusDepotWaiting.notify();
所以等待的线程将被阻止。