2016-03-19 2 views
0

Я рендеринга BufferedImage на numuber потоков. Когда я запускаю те потоки, я вызываю wait в Thread Dispatch Thread, чтобы он действительно рисовал изображение только тогда, когда все потоки рендеринга отправили сигнал уведомления.Рендеринг изображения без makign Event Dispatch Thread wait?

Это то, что происходит в EDT:

synchronized (this) 
    { 
     while(threadsCompleted<RENDERING_THREADS){ 
      try{ 
       this.wait(); 
      }catch (InterruptedException e){ 
       e.printStackTrace(); 
      } 
     } 
     threadsCompleted = 0; 
    } 
g2.drawImage(image); 

и это то, что происходит, когда поток завершает работы:

synchronized (MyPanel.this){ 
      threadsCompleted++; 
      MyPanel.this.notify(); 
     } 

Мой вопрос: есть ли способ, чтобы сделать вызов drawImage ждет завершения потоков, фактически не прекратив работу EDT? есть ли способ, чтобы в те миллисекунды, что рендеринг продолжается, пользователь может фактически взаимодействовать с пользовательским интерфейсом, таким образом, Event Dispatch Thread?

+0

Move \ первый синхронизированный код в свой собственный поток, и вызовите метод drawImage с использованием метода runnable runnable запуска SwingUtilities. –

ответ

0

Самый простой способ будет использовать параллелизм конструкций в java.util.concurrent и использовать нить, которая ждет всех остальных, чтобы закончить, как это:

public class ImageRenderer implements Runnable 
{ 
    private final CountDownLatch latch; 

    public ImageRenderer(CountDownLatch latch) 
    { 
     this.latch = latch; 
    } 

    @Override 
    public void run() 
    { 
     try 
     { 
      // code... 
     } finally 
     { 
      latch.countDown(); 
     } 
    } 
} 

public class Waiter implements Runnable 
{ 
    private final CountDownLatch latch; 

    public Waiter(CountDownLatch latch) 
    { 
     this.latch = latch; 
    } 

    @Override 
    public void run() 
    { 
     try 
     { 
      latch.await(); 
      // rendering has now finished. 
      SwingUtilities.invokeLater(() -> { 
       // do something with the image on the EDT 
      } 
     } catch (InterruptedException e) 
     { 
      Thread.currentThread().interrupt(); 
     } 
    } 
}