移动ImageView对象时的并发处理

时间:2016-01-05 09:08:18

标签: java multithreading javafx concurrency

我正在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();
        }
    }
}

有人知道如何同步线程吗?所有线程都必须等待轮到对象回到它的初始位置。

1 个答案:

答案 0 :(得分:1)

使用reference solution研究此java.util.concurrent.locks用餐哲学家的问题。对不起,这只是一个链接,但我不知道复制的版权并将其粘贴到StackOverflow中。

该解决方案基于high level concurrency Lock objects,我建议将其作为并发代码的更合适的抽象,而不是低级synchronized,等待和通知机制。

您可能希望对样本解决方案进行一些可能的修改:

修改活动场景图的JavaFX应用程序代码必须是单线程的,并且所有此类修改都在JavaFX应用程序线程上执行。当您运行不同的线程时,必须使用Platform.runLater()调用来围绕修改场景图(例如图像位置)的任何块,以便稍后将这些代码块安排在JavaFX应用程序线程上运行。

作为一种开发方法,我建议你编写程序来绘制基本用户界面和任何你想要的animations,并确保在没有产生新线程的情况下工作正常,然后将并发用餐哲学家算法整合到它