我正在JavaFX中编写用餐哲学家算法,我遇到线程同步问题,而许多线程试图同时移动对象。只有当物体处于初始位置时,物体才能移动。
这是对象类:
class ObjectToMove {
ImageView imageView;
boolean isAvailable;
(...)
synchronized public void moveToPosition(int positionNumber) {
while(!isAvailable) {
try {
wait();
} catch (InterruptedException iex) {
Thread.currentThread().interrupt();
return;
}
}
isAvailable = false;
imageView.setX(positionsList.get(positionNumber).getXPosition());
imageView.setY(positionsList.get(positionNumber).getYPosition());
}
synchronized public void backToInitalPosition() {
imageView.setX(positionsList.get(initalPosition).getXPosition());
imageView.setY(positionsList.get(initalPosition).getYPosition());
isAvailable= true;
notifyAll();
}
}
这是移动对象的类:
class MovingClass implements Runnable {
ObjectToMove objectToMove1;
ObjectToMove objectToMove2;
(...)
public doSomeMoving() {
objectToMove1.moveToPosition(positionNumber);
objectToMove2.moveToPosition(otherPositionNumber);
try() {
Thread.sleep(time);
} catch(InterruptedException iex) {
Thread.currentThread().interrupt();
}
objectToMove1.backToInitalPosition();
objectToMove2.backToInitalPosition();
}
@Override
public void run() {
while(!Thread.currentThread().isInterrupted()) {
doSomeMoving();
}
}
}
有人知道如何同步线程吗?所有线程都必须等待轮到对象回到它的初始位置。
答案 0 :(得分:1)
使用reference solution研究此java.util.concurrent.locks用餐哲学家的问题。对不起,这只是一个链接,但我不知道复制的版权并将其粘贴到StackOverflow中。
该解决方案基于high level concurrency Lock objects,我建议将其作为并发代码的更合适的抽象,而不是低级synchronized,等待和通知机制。
您可能希望对样本解决方案进行一些可能的修改:
System.out
次调用替换Platform.runLater
次调用以更新JavaFX用户界面。修改活动场景图的JavaFX应用程序代码必须是单线程的,并且所有此类修改都在JavaFX应用程序线程上执行。当您运行不同的线程时,必须使用Platform.runLater()
调用来围绕修改场景图(例如图像位置)的任何块,以便稍后将这些代码块安排在JavaFX应用程序线程上运行。
作为一种开发方法,我建议你编写程序来绘制基本用户界面和任何你想要的animations,并确保在没有产生新线程的情况下工作正常,然后将并发用餐哲学家算法整合到它