2013-04-07 1 views
8

작은 응용 프로그램을 작성하고 있는데 문제가 있음을 발견했습니다. 응용 프로그램 창에서 지연되지 않고 하나 (나중에는 아마도 두 가지) 메서드 (이 메서드는 무언가를로드하고 결과를 반환 함)를 호출해야합니다.새 스레드에서 메서드를 호출하는 쉬운 방법

나는 Executor 또는 Callable과 같은 클래스를 찾았지만 어떻게 처리 할 수 ​​있는지 이해하지 못합니다.

해결책을 올리시겠습니까? 도움이 될만한가?

모든 조언을 주셔서 감사합니다.

편집 : 방법 MUST가 결과를 반환. 이 결과는 매개 변수에 따라 다릅니다. 이 같은 뭔가 :

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

이 방법은 8-10 초 동안 작동합니다. 이 메서드를 실행하면 스레드를 중지 할 수 있습니다. 하지만 매 2 분마다이 방법을 호출해야합니다.

편집 : (내가 캐치 블록에서 return null을 넣어 경우에도) 내가 다시 오류가이 코드

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

} 

: 나는이와 코드를 편집했다.

+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에 예제가 있습니다. 그리고 공식 튜토리얼의 * 동시성 * 스레드에 대한 [주제] (http://docs.oracle.com/javase/tutorial/essential/concurrency/exinter.html). 그것이 내가 시작하는 곳입니다. 해당 자료에서 * 특정 * 항목을 이해하지 못했거나 해당 정보를 사용하는 데 어려움이있는 경우 새로운 질문을해야합니다. – millimoose

+0

나는 예를 보았고, 나는 원하는 것을 성취 할 수 없었다. – Sk1X1

+1

I * think * 당신이 찾고있는 것 ['ExecutorService.submit()'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html#submit (Callable ')을 가지고 있으므로, 관련 클래스/메소드의 문서에 초점을 맞 춥니 다. 'submit()'은 결과를 사용할 수있을 때 UI를 업데이트하는 것과 같은 일을하게 해주는'Future '을 반환해야합니다. – millimoose

답변

22

먼저, Java Thread Documentation을 살펴 보시기 바랍니다.

스레드를 사용하면 Runnable이라는 인터페이스 유형을 전달할 수 있습니다. 설명서는 here입니다. 실행 가능한 개체는 run 메서드를 가진 개체입니다. thread를 개시하면 (자),이 실행 가능 객체의 메소드 run에있는 코드를 호출합니다. 예를 들어 :

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

지금, 이것이 의미하는 것은 당신이 t.start()를 호출 할 때, 당신이 메인 스레드를 지체없이 그것을 필요로 어떤 코드를 실행할 수 있습니다. 이를 Asynchronous 메서드 호출이라고 부릅니다. 즉, 열린 스레드 (예 : main 스레드)와 병렬로 실행됩니다. :)

+0

나는 이런 식으로 시도했지만 작동하지 않았다. (다음 답에 더 많은 정보가있다.) – Sk1X1

+0

호출하는 방법에 인수를 전달하는 방법 –

20

자바 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, 예 : Runnable 또는 Callable.

자세히보기 : Platform.runLater and Task in JavaFX, Method References.자바 8에서

1

당신이 사용할 수있는 필요한 매개 변수가없는 경우 :

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

또는 매개 변수의 경우

:

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

그것은 상대적이다. 매개 변수는 숨겨져 있으며 인터페이스의 입력 매개 변수에 따라 다릅니다. '새로운 스레드 (MyClass :: doWork) .start();를 쓸 때'new Thread (() -> doWork())를 쓸 수도 있습니다. '에 대해 Runabble에는 입력 매개 변수가 없습니다. 그러나 클로저 외부 변수의 입력이 필요하다면, 두 번째 방법을 사용할 수 있습니다. –