2015-01-31 3 views
0

Я работаю над школьным проектом, который включает в себя создание двух отдельных объектов Swing Canvas, которые оживляют алгоритмы поиска ширины/глубины и первого порядка на клонированных копиях структуры данных матрицы/сетки, которые я разработал.Java-потоки не работают на отдельных объектах

Я создал несколько классов, которые помогают преобразовать матрицу/сетку в графику, которые объединены в классе SearchAnimation, который действует как ViewController для управления анимацией. На изображении ниже они отображаются справа (не в области желтого фона). Каждый объект SearchAnimation включает в себя JLabel, Canvas и White Background.

Ниже приведен скриншот макета: enter image description here

фрейму содержит два экземпляра класса SearchAnimation в контроллере класса Application (ICL.java). Эти анимации должны выполняться одновременно. Я создал отдельные темы для каждой анимации, передавая ему отдельные объекты SearchAnimation:

public void setupDepthFirstPanel() { 
      // Create a new GridGraphic Panel 
      //canvasDepthFirst = new GridPanel(null, DEPTH_FIRST_LABEL); 
      mDepthAnimation = new SearchAnimation(null, SearchAnimationType.DEPTH_FIRST_ANIMATION); 
      mDepthThread = new Thread(mDepthAnimation, "Depth Thread"); 
     } 

     public void setupBreadthFirstPanel() { 
      // Create a new GridGraphic Panel 
      //canvasBreadthFirst = new GridPanel(null, BREADTH_FIRST_LABEL); 
      mBreadthAnimation = new SearchAnimation(null, SearchAnimationType.BREADTH_FIRST_ANIMATION); 
      mBreadthThread = new Thread(mBreadthAnimation, "Breadth Thread"); 
     } 

я начинаю темы в классе ActionListener, который реагирует на событие нажатия кнопки, что с надписью «Этикетка Components»:

if (source == labelComponents) { 
      if (DEBUG && DEBUG_CLICK_LISTENER) System.out.println("\"Label Components\" Button Clicked!"); 
      /*This is where the call for the labelBreadth and labelDepth of the 
      ICLLogic class is going to occur*/ 

      // Run Animation 
      // Set Up Threads 
      System.out.println("ICL.ActionPerformed - Current Thread: " + Thread.currentThread()); 
      //mBreadthThread = new Thread(mBreadthAnimation, "Breadth Animation"); 
      //mDepthThread = new Thread(mDepthAnimation, "Depth Animation"); 

      // Start Threads 
      mBreadthThread.start(); 
      mDepthThread.start(); 
     } 

Когда программа запускается и нажимается кнопка «Компоненты ярлыков», только одна из графических объектов начинает анимацию, но кажется, что оба потока SearchAnimation работают в пределах одного JPanel/Canvas, поскольку анимация не соответствует логике либо алгоритм.

Вот реализация Runnable интерфейса в SearchAnimation:

// THREAD METHODS 
    /** Implementation of the Runnable interface for Multithreading of the 
    * SearchAnimation Class, which allows multiple SearchAnimations to run Concurrently. 
    * In this case, the Breadth & Depth-First SearchAnimations 
    * 
    */ 
    public void run() { 
     System.out.println("Thread Started - " + mAnimationType.toString()); 

     // Run the Animation 
     step(); 

    } 

который в конечном итоге вызывает determineSearchType(), который переключается на Enum, чтобы выбрать подходящий алгоритм:

public void determineSearchType(Pixel p) { 
    // Animate a single pixel movement, step depends on AnimationType 
    if (DEBUG && DEBUG_STEP_NEXT_PIXEL) { System.out.println("Determining Animation Type..."); } 
    switch (mAnimationType) { 

     case BREADTH_FIRST_ANIMATION: 
      if (DEBUG && DEBUG_STEP_NEXT_PIXEL) { System.out.println("Animation Type: Breadth-First"); } 
      // Begin Breadth-First Search 
      stepBreadthSearch(p); 
      break; 

     case DEPTH_FIRST_ANIMATION: 
      if (DEBUG && DEBUG_STEP_NEXT_PIXEL) { System.out.println("Animation Type: Depth-First"); } 
      // Begin Depth-First Search 
      stepDepthSearch(p); 
      //simpleDepthSearch(mCurrentPixel); 
      break; 
    } 
} 

Когда я чередовать комментирования их нить/анимация выполняется на собственной графике JPanel/Canvas и дает ожидаемые результаты. Я довольно новичок в потоковом режиме, и я уверен, что у кого-то есть простое решение. Любые идеи о том, как я могу решить проблему, которую анимация не будет анимировать одновременно?

+3

К сожалению, качели абсолютно ** не ** потолочные. Вы ** абсолютно ** не можете получить доступ к объектам Swing из нескольких потоков. Это ** будет результатом непредсказуемого поведения. Все и любые взаимодействия с объектами Swing ** должны происходить на EDT. –

+0

Даже если они являются отдельными экземплярами, которые имеют отдельные ссылки и значения свойств? Класс расширяет эти объекты качания. – Matt

+0

Не имеет значения. Качание должно происходить на EDT. Полная остановка.Для выполнения фоновых задач вам необходимо использовать [Swing workers] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html). –

ответ

-1

option1:

, чтобы получить еще один шанс на исполнение. в конце кода нити, попробуйте yield() и посмотреть, если у вас есть немного удачи

Thread.currentThread().yield(); 

option2:

добавить флаг в вашей теме, чтобы сделать паузу и продолжить нить. Идея:

после резьбы 1 закончить шаг - приостановить резьбу 1 - затем начать резьбу 2 - после резьбы 2 закончить шаг - приостановить резьбу 2 - и продолжить резьбу 1 снова.

Смежные вопросы