多线程Java,但只有一个线程工作
我的Java线程不能独立工作,如何修复它?这是最初的主要问题:多线程Java,但只有一个线程工作,java,multithreading,concurrency,synchronized,Java,Multithreading,Concurrency,Synchronized,我的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); thMechan
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.
}
两个线程都按预期运行
前10秒:
Bus: Bus 1by Mechanic 1
Bus: Bus 2by Mechanic 1
再过10秒:
Bus: Bus 1by Mechanic 1
Bus: Bus 2by Mechanic 1
我的怀疑是机修工1(线程)自身锁定,这样机修工2(线程)就无法帮助它,因为机修工1完成所有任务。不管怎样,如何修复它
注意:我只在早期使用synchronized for wait(用于通知),如果我不将其放入,则会出现网络监视异常
编辑:添加LinkedList并通知澄清,提供的所有列表都是LinkedList。一节课
编辑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();
}
}
}
synchronized(listbusdepotwating){
while(ListBusDepotWaiting.size()==0){
试一试{
ListBusDepotWaiting.wait();
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
//引擎还没修好
//通知修理工修理汽车
if(ListBusEngineFix.size()<2){
//意味着力学是空的
总线=(总线)((链接列表)ListBusDepotWaiting.poll();
(LinkedList)ListBusEngineFix.offer(总线);
如果(ListBusEngineFix.size()==1){
已同步(ListBusEngineFix){
ListBusEngineFix.notify();
}
}
}
现在他们可以调用并通知,但原来的问题仍然存在,即无法为
机械2
工作等待
和通知
应在同一个monotor对象上执行
在代码中,您正在等待
ListBusEngineFix.wait()代码>
而通知
BusShop.listbusdepotwating.notify()代码>
因此等待的线程将被阻止。哪里是notify
?什么是ListBusEngineFix
?感谢您的帮助,但没有按预期解决问题,我已将问题移至[链接]此处()以获得更简化的版本。