2013-10-14 4 views
1

У меня есть общий вопрос о чем-то я работал на и поиск ответов на 3 дня теперьJava вопросы выполнения программы

Сценарий 1 (и в основном отказались от из чистого разочарования.);

метод

) называется, что создает и отображает «Пожалуйста, подождите ..» JWindow компонент с .setVisible (истинной)

B) метод называется, что делает простые расчеты и System.out-х годах результаты

C) «Пожалуйста, подождите ..» сохраняется, как ожидается, на стадии исполнения B

D) стадия B и заканчивается .setVisible (ложь) называется на «Пожалуйста, подождите» окно, и это идет так, как ожидалось

До сих пор о, хорошо.

Сценарий 2;

То же, что и сценарий 1, за исключением того, что работа на этапе B намного сложнее и вызывает пользовательский класс, который выполняет кучу db-запросов/записей, которые занимают в среднем около 3-6 секунд для завершения. Пользовательский класс не запускается или не нарезается резьбой и просто вызывается с;

customClass cc = new customClass(); 
cc.makeMyDataPlease(); 
  • по какой-либо причине, в сценарии 2 .setVisible (истина), шаг 'A' не происходит до тех пор, после комплекса этап работы 'B' не будет завершена.

Я провел 2 1/2 дня, экспериментируя со многими решениями этих типов проблем, найденными на этом сайте, а другие - без везения. Пробовал swingworker, invokelater, нитку и т. Д. И пришел к выводу, что мне нужно исследовать это еще до того, как вырвать больше волос.

У меня была аналогичная проблема с методом, который соединяется с URL-адресом и публикует данные. Я пытался просто установить текст на простой JLabel непосредственно перед запуском процедуры подключения к сети, и он тоже не удался. Текст был установлен после завершения веб-процедуры.

Как будто виртуальная машина была нарезать каждое выполнение инструкции.

Мое подозрение, что классы mysql и сетевые классы URL совместно используют свойства (networking?), Которые замораживают другие задачи, которые, возможно, не успели закончить.

Вот мои вопросы/неурядицы:

Если исполнение в главном потоке Java является последовательным, если новый поток не будет создан/называется, почему бы ничего мешать этому SetVisible (правда) заявление? Он логически должен завершить до того, как выполняются обычные операторы базы данных, и все же это не так.

Что является окончательным способом в java, чтобы гарантировать, что один оператор полностью выполнен до следующий?(Или, по крайней мере, , а следующий, так как я уверен, что VM может сделать setVisible достаточно быстро, чтобы они могли даже начать синхронно).

Заранее спасибо

В частности мой вопрос; что лучше всего подходит для решения проблем параллелизма, связанных с процедурами «blocker» в java и как лучше всего работать в рамках этих ограничений.

ответ

2

То же сценарию 1, за исключением, что работы на стадии B является гораздо более сложным и вызывает пользовательский класс, который делает кучу БД запросов/пишет, что берут в среднем около 3-6 секунд, чтобы завершить , Пользовательский класс не работает или не имеет резьбы и просто вызывается с;

customClass cc = new customClass(); cc.makeMyDataPlease(); для по любой причине, в сценарии 2, шаг .setVisible (true) «A» делает не до тех пор, пока не завершится сложный рабочий шаг «B».

Проблема в том, что Swing - это однопоточная среда. Ожидается, что все взаимодействия с пользовательским интерфейсом будут выполняться в контексте потока диспетчеризации событий. Любой процесс, который блокирует этот поток, не позволит ему обрабатывать новые события, включая запросы на рисование.

Что происходит, сценарий 2, скорее всего, блокирует EDT, не позволяя ему отображать окно, но вместо этого, к моменту завершения всей обработки, EDT реагирует на событие закрытия сразу после события open.

Из-за того, как структура структурирована, вы должны убедиться, что;

  1. Все взаимодействия и модификации пользовательского интерфейса выполняются в EDT
  2. Любой длинный ход или процесс блока выполняется за пределами EDT.

Для получения более подробной информации посетите Concurrency in Swing.

Без дальнейших доказательств, мое чувство кишки является использование SwingWorker

Например ...

import java.awt.EventQueue; 
import java.util.concurrent.ExecutionException; 
import javax.swing.JLabel; 
import javax.swing.JWindow; 
import javax.swing.SwingWorker; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class QuickWorker { 

    public static void main(String[] args) { 
     new QuickWorker(); 
    } 

    public QuickWorker() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JWindow window = new JWindow(); 
       window.add(new JLabel("Look no hands!")); 
       window.pack(); 
       window.setLocationRelativeTo(null); 

      } 
     }); 
    } 

    public class Worker extends SwingWorker<Object, Object> { 

     private JWindow window; 

     public Worker(JWindow window) { 
      this.window = window; 
     } 

     @Override 
     protected Object doInBackground() throws Exception { 
      // Long running process... 
      Thread.sleep(5000); 
      return "All done"; 
     } 

     @Override 
     protected void done() { 
      try { 
       // Get the results of the process if you want them... 
       get(); 
      } catch (InterruptedException | ExecutionException ex) { 
       ex.printStackTrace(); 
      } 
      window.dispose(); 
      // This is only here because the example will keep running without it :P 
      System.exit(0); 
     } 
    } 
} 
+0

Я думаю, что моя путаница/есть; если, как вы говорите, качание - это однопоточная среда, то как мы определяем, кроме подхода «попытаться, провалиться, продолжать», что такое «блокирующий» процесс, а что нет? – jeff

+0

Многие придут к опыту, некоторые придут к здравому смыслу, а остальное придет от чтения документов ... – MadProgrammer

+0

Но ваш ответ действительно полезен, и я думаю, мне, возможно, придется пойти с этим подходом. Я надеялся, что этого не произойдет, поскольку у меня много сложных процедур, которые теперь все должны быть переписаны/реструктурированы. Но, по крайней мере, они будут выполнены правильно. Живи и учись. Благодаря! – jeff

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