2013-08-23 2 views
0

웹 서비스와 웹 서비스 호출이 스레드에 의해 처리되므로 비동기 적으로 실행될 수 있고 시간이 초과 될 수 있습니다. 그러나 스레드는 "실행 가능"하며 "호출 가능"하지 않으므로 스레드가 웹 서비스 응답을 되돌릴 수 없습니다.자바에서 값을 반환하도록 스레드 만들기

나는 호출 가능을 사용해야한다는 문장을 읽었습니다. 실행 가능한 스레드로부터 응답을 반환하는 방법이 있습니다. 작은 예제를 게시하면 값을 반환 할 수 있습니다.

public class HelloThread extends Thread { 

    public void run() { 
     System.out.println("Hello from a thread!"); 
     String a="Hello"; 
    } 

    public static void main(String args[]) { 
     (new HelloThread()).start(); 
    } 

} 
+1

스레드가 비동기 적으로 실행되면 한 스레드에서 다른 스레드로 값을 반환 할 기회가 없습니다. 따라서 한 클래스에 있다면 하나의 전역 변수를 가질 수 있다고 생각할 수 있습니다. 그러나 스레드가 병렬로 실행될 때 어떤 상황에서는 효과적이지 않습니다. –

+1

[Future] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html) 인터페이스 – MadProgrammer

답변

4

당신은 Thread에 콜백을 통과해야하고 완료되면 스레드는 값으로 콜백을 호출 할 수 있습니다.

+0

에 콜백을 전달하는 방법 – user2354846

+1

콜백을 스레드 생성자 내의 객체로 전달하고 스레드 인스턴스의 인스턴스 변수로 저장합니다 (물론 스레드 구현에 생성자를 구현해야합니다). – Matthias

0

스레드에서 값을 반환 할 수 없습니다. 그러나 SwingWorker을보고 사용하는 데 관심이있을 수 있습니다. 이를 통해 백그라운드에서 작업을 수행 할 수 있으며 doneget 메소드를 사용하여 완료되면 무언가를 반환 할 수 있습니다.

Here it is in more details

다른 방법은 스레드 실행 스레드의 run있어서 그 내부에 어떤 값을 할당 시작 전에 변수를 정의하는 것이다. 이렇게하면 스레드가 완료 될 때 해당 변수를 사용할 수 있습니다. 그러나 또 다시 concurrencylocks 등의 모든 정보를 처리해야합니다.

2

명시 적 스레드를 사용하는 대신 ExecutorService 인터페이스를 사용할 수 있습니다.

Executors 클래스를 사용하여 인스턴스를 생성 한 다음 submit을 호출하고 Callable을 전달할 수 있습니다. 그러면 Callable의 코드가 다른 스레드에서 실행되고 즉시 Future 개체가 반환됩니다.

그런 다음 Callable의 비동기 실행 완료, 그 결과를 검색 할 때까지 기다릴 위해 Futureget를 호출 할 수 있습니다.