2013-04-07 59 views
8

我正在寫小應用程序,現在我發現了一個問題。 我需要調用一個(稍後也許兩個)方法(此方法加載一些東西並返回結果),而不會在應用程序窗口中出現滯後。簡單的方法在新線程中調用方法

我發現類似ExecutorCallable,但我不明白如何使用這些類。

你可以請任何解決方案,這有助於我嗎?

感謝您的所有建議。

編輯:方法必須返回結果。這個結果取決於參數。 事情是這樣的:

public static HtmlPage getPage(String page) throws FailingHttpStatusCodeException, MalformedURLException, IOException { 
     return webClient.getPage(page); 
} 

此方法效果約8-10秒。執行此方法後,可以停止線程。但我需要每2分鐘調用一次這些方法。

編輯:我編輯與此代碼:

public static HtmlPage getPage(final String page) throws FailingHttpStatusCodeException, MalformedURLException, IOException { 
    Thread thread = new Thread() { 
     public void run() { 
      try { 
       loadedPage = webClient.getPage(page); 
      } catch (FailingHttpStatusCodeException | IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    thread.start(); 
    try { 
     return loadedPage; 
    } catch (Exception e) { 
     return null; 
    } 

} 

有了這個代碼,我再次收到錯誤(即使我把return null塊)。

+1

['Executor'(http://docs.oracle。 com/javase/7/docs/api/java/util/concurrent/Executor.html)和['ExecutorService'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent /ExecutorService.html)在javadoc中有示例。和官方教程中的* concurrency *線程中的[主題](http://docs.oracle.com/javase/tutorial/essential/concurrency/exinter.html)。那就是我開始的地方。你應該問一個新的問題,如果你不明白這些材料中的某些*特定*,或者如果你堅持使用它們中的信息。 – millimoose 2013-04-07 20:03:31

+0

我看到了這些例子,我不能達到我想要的。 – Sk1X1 2013-04-07 21:33:58

+1

我*想*你在找什麼[''ExecutorService.submit()'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html#submit (java.util.concurrent.Callable))與'Callable ',所以請關注這些文檔以及相關的類/方法。 'submit()'應該返回一個'Future ',它可以讓你在結果可用時做一些事情(比如更新UI)。 – millimoose 2013-04-07 21:50:45

回答

22

首先,我會建議看看Java Thread Documentation

使用線程,您可以傳入名爲Runnable的接口類型。該文檔可以找到here。可運行對象具有run方法。當你啓動一個線程時,它會調用此可運行對象的run方法中的任何代碼。例如:

Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
       // Insert some method call here. 
     } 
}); 

現在,這句話的意思是,當你調用t.start(),它將運行任何代碼,你需要它不落後於主線程。這稱爲Asynchronous方法調用,這意味着它與您打開的任何其他線程(如main線程)並行運行。 :)

+0

我嘗試這樣的事情,但它不起作用(更多信息在下一個答案) – Sk1X1 2013-04-07 21:33:12

+0

如何將參數傳遞給調用方法 – 2014-09-25 05:56:37

20

由於Java 8,你可以使用更短的形式:

new Thread(() -> { 
    // Insert some method call here. 
}).start(); 

更新: 此外,您還可以使用方法參考:

class Example { 

    public static void main(String[] args){ 
     new Thread(Example::someMethod).start(); 
    } 

    public static void someMethod(){ 
     // Insert some code here 
    } 

} 

您可以在使用它你參數列表與要求的@FunctionalInterface相同,例如RunnableCallable

查看更多:Platform.runLater and Task in JavaFXMethod References

1

在Java 8中,如果沒有,你可以使用所需的參數:

new Thread(MyClass::doWork).start(); 

或者在參數情況:

new Thread(() -> doWork(someParam)) 
+0

這是相對的。參數只是隱藏的,它取決於接口的輸入參數。當你寫'新線程(MyClass :: doWork).start();'你也可以寫'新線程(() - > doWork())'對於Runabble沒有輸入參數。但是,如果你需要一個變量的輸入,它不在閉包之內,那麼你可以做第二種方法。 – 2016-11-01 14:53:55