2016-03-19 6 views
0

Ben bir iş parçacığı numute üzerinde bir BufferedImage yapıyorum. Bu iş parçacığı başlattığımda, olay gönderim iş parçacığı üzerinde beklemeyi bekliyorum, böylece görüntüyü yalnızca tüm oluşturma iş parçacıkları bildirim sinyalini gönderdiğinde çizer.Olay Gönderme makign olmadan Görüntü Rendering Konu bekleyin?

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

ve bu iplik çalışmasını bitirdiğinde olur::

Bu EDT böyle olur

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

Sorum şu: aramayı yapmak için bir yol var drawImage, EDT çalışmasını gerçekten durdurmadan iş parçacığının bitmesini bekleyin. İşlemin devam ettiği o milisaniye cinsinden kullanıcı UI ile etkileşimde bulunabilmenin bir yoludur, böylece Olay Sevk İpliği?

+0

Taşı kendi iş parçacığı içine, ve SwingUtilities invokeLater Runnable run yöntemini kullanarak drawImage yöntemini çağırın. –

cevap

0

kolay yolu bu gibi java.util.concurrent eşzamanlılık yapıları kullanabilme ve tamamlamak için tüm diğerleri için bekleyen bir iş parçacığı kullanmak olacaktır: İlk senkronize kod \

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