Как обнаружить нарушения политики потоков Swing - PullRequest
11 голосов
/ 01 июля 2010

Я ищу автоматический способ обнаружения нарушений однопоточной политики Swing в моем коде. Я ищу что-то вроде кода AOP, который вы перетаскиваете в виртуальную машину во время работы приложения Swing, и он регистрирует все места, где компонент Swing изменен за пределами EDT.

Я не AOP парень, но я бы хотел создать прокси AOP для каждого класса java.swing. *, Который выглядит как

AOP_before(Method m, Object args[]) {
 if (!isEventDispatchThread(Thread.currentThread()) {
  logStack(new RuntimeException("violation!"));
 }

 invoke(m, args);
}

Кто-нибудь знает проект или утилиту, которая делает это?

Ответы [ 3 ]

8 голосов
/ 01 июля 2010

Я не использовал этот конкретный, но этот CheckThreadViolationRepaintManager должен помочь.

Требуется добавить:

RepaintManager.setCurrentManager(new CheckThreadViolationRepaintManager());

кваш код однако.

3 голосов
/ 30 октября 2012

Для потомков, вот упрощенная версия CheckThreadViolationRepaintManager, найденная TofuBeer.

RepaintManager.setCurrentManager(new RepaintManager() {
   public synchronized void addInvalidComponent( JComponent component ) {
     check( component );
     super.addInvalidComponent( component );
   }
   public void addDirtyRegion( JComponent component, int x, int y, int w, int h ) {
     check( component );
     super.addDirtyRegion( component, x, y, w, h );
   }
   private void check( JComponent c ) {
     if( !SwingUtilities.isEventDispatchThread() && c.isShowing() ) {
        new Throwable("EDT required!").printStackTrace();
     }
   }
});

Просто вызовите это в своем основном методе, и вы получите протоколы стека, записанные при каждом изменении компонентов в не-EDTрезьб.

3 голосов
/ 01 июля 2010

Я нашел пост в блоге за 4 года с описанием некоторых решений , но мне было бы очень интересно, если бы вы нашли такое, которое обнаруживает большинство нарушений EDT. RepaintManager, похоже, не является пуленепробиваемым средством обнаружения всех нарушений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...