2013-04-07 23 views
8

Küçük bir uygulama yazıyorum ve şimdi bir sorun keşfettim. Uygulama penceresinde gecikmeden bir (daha sonra belki iki) yöntemi (bu yöntem bir şey yükler ve sonucu döndürür) çağırmam gerekir.Yeni iş parçacığı içinde kolay bir yöntem aramak için

Executor veya Callable gibi sınıflar buldum, ancak bunlarla nasıl çalışacağımı anlamıyorum.

Lütfen bana yardımcı olan herhangi bir çözüm gönderir misiniz?

Tüm öneriler için teşekkürler.

Düzenleme: yöntem zorunluluk sonucu döndüren. Bu sonuç parametrelere bağlıdır. Böyle şey:

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

Bu yöntem yaklaşık 8-10 saniye çalışır. Bu yöntemi uyguladıktan sonra, iş parçacığı durdurulabilir. Ama her 2 dakikada bir yöntemleri çağırmam gerek.

Düzenleme: (ı catch blok dışına return null koymak bile) tekrar hata alıyorum bu kod ile

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; 
    } 

} 

: Bununla kodunu düzenledi.

+1

[ 'Executor'] (http://docs.oracle. com/javase/7/docs/api/java/util/eşzamanlı/Executor.html) ve ['ExecutorService'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent /ExecutorService.html) javadoc'ta örnek var. Ve [bir konu] (http://docs.oracle.com/javase/tutorial/essential/concurrency/exinter.html) resmi eğitimde * eşzamanlılık * iş parçacığı üzerinde. İşte başladığım yer burası. Bu materyallerde belirli bir şeyi anlamıyorsanız veya bu bilgileri içinde kullanmadığınız takılı kalıyorsanız yeni bir soru sormalısınız. – millimoose

+0

Örnekleri gördüm, istediğim şeyi elde edemem. – Sk1X1

+1

I * düşün * ne için arıyorsunuz ['ExecutorService.submit()'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html#submit (java.util.concurrent.Callable)) bir "Callable " ile, bu nedenle ve ilgili sınıflar/yöntemler için belgelere odaklanın. 'submit() 'sonuç geldiğinde bir şey yapmanıza izin veren bir' Gelecek 'döndürmelidir. – millimoose

cevap

22

İlk olarak, Java Thread Documentation'a bakmanızı öneriyorum.

Bir Thread ile, Runnable adında bir arabirim türünde geçiş yapabilirsiniz. Dokümantasyon here bulunabilir. Runnable, run yöntemine sahip bir nesnedir. Bir iş parçacığı başlattığınızda, bu çalıştırılabilir nesnesinin run yönteminde hangi kodu çağırır. Örneğin:

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

Şimdi, bu anlamı t.start() çağırdığınızda, bu ana iş parçacığı kalmış olmadan bunu ne gerekiyorsa kod çalışır olduğunu. Bu, main iş parçacığınız gibi açık olan diğer tüm iş parçacıklarına paralel olarak çalıştığı anlamına gelen Asynchronous yöntem çağrısı olarak adlandırılır. :)

+0

Ben böyle bir şey deneyin, ama işe yaramadı (bir sonraki cevapta daha fazla bilgi) – Sk1X1

+0

Arama yöntemine bağımsız değişken iletme yöntemi –

20

Java 8 yana daha kısa biçimini kullanabilirsiniz:

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

Güncelleme: Ayrıca , sen yöntem başvuru kullanabilirsiniz:

class Example { 

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

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

} 

Sen ne zaman kullanabilirler senin argüman listesi gerekli @FunctionalInterface ile aynıdır, örn. Runnable veya Callable.

Daha fazla bilgi için: Platform.runLater and Task in JavaFX, Method References.Java 8'de

1

kullanabilirsiniz gerekmez parametreler varsa:

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

Veya parametrelerin durumunda

:

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

Bu göreceli. Parametreler sadece gizlidir ve arayüzün giriş parametrelerine bağlıdır. Yeni Konu (MyClass :: doWork) .start(); '' yazdığınızda da 'yeni Konu (-) -> doWork()) 'yazabilirsiniz.' Runabble için giriş parametresi yoktur. Ancak, kapağın dışında bir değişkenden girdi gerekiyorsa, evet, ikinci yolu yapabilirsiniz. –