2016-12-06 4 views
0

Мне сказали запустить все мои процессы подключения MySQL в другом потоке помимо основного потока, чтобы избежать зависания основного потока процесса, который занимает несколько секунд.Установление соединения асинхронно

Поэтому я создал ConnectionPool в отдельном потоке, так что мой графический интерфейс запускается независимо от установления соединения. Однако это не так. Когда я запускаю программу, она ждет, пока соединение не будет установлено, а затем оно на самом деле запускает запуск (args); Моя забота - почему он не работает независимо при создании нового потока?

public static void main(String[] args) { 
    initiateConnection(); 
    launch(args); 
} 

private static void initiateConnection() { 
    new Thread(() -> { 
     try { 
      connection = new ConnectionPool("jdbc:mysql://127.0.0.0/comm", "root", 
        "pass"); 
     } catch (Exception e) { 

     } 
    }).run(); 
} 

ответ

1

От Javadocs из Thread.run()

Если эта нить была построена с использованием отдельного объекта Runnable запуска, то метод выполнения этого Runnable объекта называется; в противном случае этот метод ничего не делает и возвращает.

Так, только тело лямбда-выражения (который на самом деле тело метода run из java.lang.Runnable) называется. Это эквивалентно:

(new Runnable() { 

     @Override 
     public void run() { 
      try { 
       connection = new ConnectionPool("jdbc:mysql://127.0.0.0/comm", "root", 
         "pass"); 
      } catch (Exception e) { 

      } 
     } 
    }).run(); 
0

Вы должны позвонить .start() вместо .run(). JVM будет звонить .run на вашу лямбду для вас.

+0

В чем разница между ними? – Pablo

+0

'.start' на самом деле заставляет поток запускать выполнение (aka запускается асинхронно, создавая поток и вызывая' .run' в этом потоке); '.run' - синхронная операция. –

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