2016-07-13 4 views
1

Я просто пробую следующий код, но swingworker не выполняется. Если я поместил его в действие GUI-приложения (в событии нажатия кнопки), оно выполняется. Какова техническая причина этого?Java SwingWorker не работает в основном методе?

public static void main(String[] args) { 

    new SwingWorker<Object, Object>() { 
     @Override 
     protected Object doInBackground() throws Exception { 
      System.out.println("do in background....."); 
      return null; 
     } 
    }.execute(); 

} 
+1

Что вы предполагаете, и что происходит вместо этого? Когда я запускаю этот код, он печатает 'do in background .....', а затем заканчивает – Clayn

+0

Я ожидал сообщение« сделать в фоновом режиме »на консоли. но это не будет. – user2486322

+0

Странно. Если я запустил это с 1.8_u60, я получу то, что вы ожидаете – Clayn

ответ

3

См. Concurrency in Swing: Initial Threads для получения более подробной информации.

Он работает после добавления SwingUtilities.invokeAndWait

public static void main(String[] args) { 

     try { 
      SwingUtilities.invokeAndWait(new Runnable() { 

       @Override 
       public void run() { 
        new SwingWorker<Object, Object>() { 
         @Override 
         protected Object doInBackground() throws Exception { 
          System.out.println("do in background....."); 
          return null; 
         } 
        }.execute(); 

       } 
      }); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
0

Это вопрос времени. Если фоновая задача завершается перед главным способом он будет печатать «делать в фоновом режиме ......»:

public static void main(String[] args) throws Exception { 

    new SwingWorker<Object, Object>() { 
     @Override 
     protected Object doInBackground() throws Exception { 
      System.out.println("do in background....."); 
      return null; 
     } 
    }.execute(); 

    Thread.sleep(100L); 
} 

Если же основные отделки до фоновой задачи была возможность бежать, он не будет печатать ничего:

public static void main(String[] args) throws Exception { 

    new SwingWorker<Object, Object>() { 
     @Override 
     protected Object doInBackground() throws Exception { 
      Thread.sleep(100L); 
      System.out.println("do in background....."); 
      return null; 
     } 
    }.execute(); 

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