【发布时间】:2018-04-18 12:39:01
【问题描述】:
我之前可能问过here,理解不透,复杂,现在改写程序,更容易理解。
问题:
当我运行 2 个线程时,只有 1 个线程完成这项工作。
疑点帮手
我怀疑线程自己锁住了,所以其他线程无法访问它。
代码
初始化主要
Shop shop = new Shop();
CarGenerator carGenerator = new CarGenerator(shop);
Mechanics mechanics1 = new Mechanics(shop, "Mechanics 1");
Mechanics mechanics2 = new Mechanics(shop, "Mechanics 2");
//Threads
Thread CarThread = new Thread(carGenerator);
Thread Mechanics1Thread = new Thread(mechanics1);
Thread Mechanics2Thread = new Thread(mechanics2);
CarThread.start();
Mechanics1Thread.start();
Mechanics2Thread.start();
在这里我们可以看到 2 个线程已创建并按预期工作。
现在机械师的功能是做什么的:
@Override
public void run() {
while (true) {
System.out.println("Working Thread: " + Thread.currentThread().getName());
shop.CarFix(MechanicsName);
}
}
线索:
这里我打印出有多少个线程,结果是2:
Working Thread: Thread-1
Working Thread: Thread-2
现在两个线程都按预期运行很好,现在我将在商店无限工作。我不会切入展示整个过程并更好地理解:
public void CarFix(String MechanicsName) {
Car car;
synchronized (ListCarEntry) {
while (ListCarEntry.size() == 0) {
try {
ListCarEntry.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
Logger.getLogger(Shop.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Working Thread: " + Thread.currentThread().getName());
//Done 2 Sec Fixing
//Release Now
car = (Car) ((LinkedList<?>) ListCarEntry).poll();
((LinkedList<Car>) ListCarFix).offer(car);
System.out.println("Car FIX: " + car.getCarName() + " being fixed by " + MechanicsName);
}
这里只有一个线程在运行,而不是之前的2个线程,结果是:
Working Thread: Thread-1
Car FIX: Car 1 being fixed by Mechanics 1
Working Thread: Thread-1
Car FIX: Car 2 being fixed by Mechanics 1
Working Thread: Thread-1
Car FIX: Car 3 being fixed by Mechanics 1
目前只修复了 Mechanics 1,而 Mechanics 2 缺失。
线索 2:
当我尝试 REMOVE THE SLEEP FOR 2 SEC 时,我真正想要的结果是这样的:
Working Thread: Thread-1
Car FIX: Car 1 being fixed by Mechanics 1
Working Thread: Thread-2
Car FIX: Car 2 being fixed by Mechanics 2
Working Thread: Thread-1
Car FIX: Car 3 being fixed by Mechanics 1
这是我真正想看到的。
问题:
如何确保线程按预期工作并为其提供睡眠功能?
对于读到最后的人:
看到我不知道删除睡眠可能会解决问题,安静奇怪..无论如何,任何想法的家伙..对于长期存在的问题感到抱歉。
编辑
这是我的 CarGenerator 类:
public class CarGenerator implements Runnable{
Shop shop;
public CarGenerator(Shop shop) {
this.shop = shop;
}
@Override
public void run() {
int i = 0;
while (true) {
i++;
Car car = new Car(shop, "Car " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(CarGenerator.class.getName()).log(Level.SEVERE, null, ex);
}
Thread thCar = new Thread(car);
thCar.start();
}
}
}
调用这个汽车类将汽车移入商店:
public class Car implements Runnable{
private String CarName;
private Shop shop;
public Car(Shop shop, String CarName) {
this.shop = shop;
this.CarName = CarName;
}
public String getCarName() {
return CarName;
}
@Override
public void run() {
//DO
synchronized(this) {
shop.CarEntrance(this);
}
}
}
这是汽车进入商店的地方
public void CarEntrance(Car car) {
System.out.println("Entry: " + car.getCarName());
if (ListCarEntry.size() == 10){
System.out.println("Exit: " + car.getCarName() + "Exit the store, cause FULL");
return;
}
((LinkedList<Car>) ListCarEntry).offer(car);
if (ListCarEntry.size() == 1) {
synchronized(ListCarEntry) {
ListCarEntry.notify();
}
}
}
如此处所示,我调用 notify Synchronized 通知,由机械师调用,等待更早等待汽车进入。
【问题讨论】:
标签: java multithreading concurrency synchronized