2014-08-16 3 views
2

У меня есть приложение GUI с JDBC. Один поток предназначен для качания gui.Java-поток для JDBC

public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() { 

      public void run() 
      { 
       try { 
        runApp(); 
       } catch (SQLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

После запуска программы отображаются мои данные из базы данных в JTable.

public List<Category> getCategory() throws SQLException 
    { 
     List<Category> cat = new ArrayList<Category>(); 

     Connection conn = Database.getInstance().getConnection(); 

     System.out.println(conn); 

     String sql = "select id, name from kategorie"; 
     Statement selectStatement = conn.createStatement(); 

     ResultSet results = selectStatement.executeQuery(sql); 

     while(results.next()) 
     { 
      int id = results.getInt("id"); 
      String name = results.getString("name"); 

      Category category = new Category(id, name); 
      cat.add(category); 
     } 

     results.close(); 
     selectStatement.close(); 

     return cat; 

    } 

Интересно, как добавить новый поток, чтобы все операции с базой данных выполнялись в отдельном потоке, а не в этом потоке.

+1

ЮПП, посмотрите на [SwingWorker] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html). Я мог бы найти пример тоже для вашего удобства. Хотя мне нужно немного для этого :-) –

+0

Вот ссылка [https://www.dropbox.com/s/r9cct4kxns0rr6i/database.zip), хотя я использую 'Derby' в качестве базы данных, которая приходит по умолчанию с установкой Java. Надеюсь, ты знаешь, как это сделать, иначе дай мне знать. Вам просто нужно запустить его, как: 'java -classpath.;% JAVA_HOME% \ db \ lib \ derby.jar example.JARCreationExample.java'. Надеюсь, вы тоже установили переменную 'JAVA_HOME' в вашей системе :-) –

+1

[Этот учебник] (http://albertattard.blogspot.com/2008/09/practical-example-of-swing-worker.html) является хорошо. –

ответ

2

Посмотрите на класс ExecutorService.

ExecutorService exec = Executors.newFixedThreadPool(2); 
exec.execute(new Runnable() { 
// Run your database thread 

}); 
exec.shutdown(); 
+0

Хорошо. Что вы думаете об этом решении http://stackoverflow.com/questions/3489543/how-to-call-a-method-with-a-separate-thread-in-java – lukassz

+1

@ lukassz: В конце получения значений , 'JTable' должен быть обновлен в« Event Dispatcher Thread - EDT ». Поэтому, если вы идете на 'SwingWorker', то thingy - это то, что не даст вам головных болей, поскольку методы' process()/done() 'по умолчанию помещаются в' EDT'. –

+0

@ lukassz это лучше плюс взять nIcE cOw notes –

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