【问题标题】:Multi Thread Java, but only one thread working多线程Java,但只有一个线程工作
【发布时间】:2018-04-18 07:16:40
【问题描述】:

我的 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 (Thread) 自己锁定,所以 Mechanic 2 (Thread) 无法帮助它,因为 Mechanic 1 完成了所有任务。无论如何,如何解决它?

注意:我只在前期使用了synchronized等待(通知),不放会出现网络监控异常。

编辑:为澄清添加了 LinkedList 和 Notify,提供的所有列表都是 Linked List。一个类。

编辑 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工作

【问题讨论】:

  • notify在哪里?
  • 什么是ListBusEngineFix

标签: java multithreading concurrency synchronized


【解决方案1】:

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

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

ListBusEngineFix.wait();

notify通过

BusShop.ListBusDepotWaiting.notify();

所以等待的线程会被阻塞。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多