2010-03-09 4 views
4

어떻게 thead에서 변수를 반환 할 수 있습니까 (나는 스레드도 처리했습니다). 정적 변수는이 경우 작동하지 않습니다.자바 : 스레드에서 가치를 얻으시겠습니까?

업데이트 : 여기 하나의 트위스트가 있습니다. 어떻게 차단하고 결과를 기다리지 않고도이 작업을 수행 할 수 있습니까? 생성 된 스레드를 폴링하고 너무 길게 (예 : 1 분 초과) 매달려 있으면이를 삭제하고, 스폰 된 스레드가 너무 오래 걸리는 경우 주 스레드에서 계속 진행할 수 있어야합니다.

답변

13

대신 사용 Thread (또는 Runnable)의 Callable<V> 당신은 Future<V>로 초래하고 호출 할 ExecutorService를 사용하여 얻을 수 있도록.

package com.stackoverflow.q2413389; 

import java.util.Arrays; 
import java.util.List; 
import java.util.concurrent.Callable; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.Future; 

public class Test { 

    public static void main(String... args) throws Exception { 
     ExecutorService executor = Executors.newCachedThreadPool(); 
     List<Future<String>> results = executor.invokeAll(Arrays.asList(new Task())); 
     for (Future<String> result : results) { 
      System.out.println(result.get()); // Prints "myResult" after 2 seconds. 
     } 
     executor.shutdown(); 
    } 

} 

class Task implements Callable<String> { 

    public String call() throws Exception { 
     Thread.sleep(2000); // Do your running task here, this example lasts 2 seconds. 
     return "myResult"; 
    } 

} 

업데이트 : 여기

그냥 copy'n'paste'n'run, SSCCE이다, 타임 아웃 후 죽일 ScheduledExecutorService을 활용하는 방법을 질문하여 갱신에 따라 대신. 여기에 약간 변경 코드는 다음과 같습니다

MyObject a = new MyObject(); new Thread(a).start();

그냥 실행 가능한을 구현하기 위해 기억 나는 (방법 스레드 개체의 멤버 값에 액세스하는 방법)이 간단한 방법을 사용할 수 있습니다 귀하의 질문을 이해한다면

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); 
List<Future<String>> results = executor.invokeAll(Arrays.asList(new Task()), 1, TimeUnit.SECONDS); // Timeout of 1 second. 
for (Future<String> result : results) { 
    if (!result.isCancelled()) { 
     System.out.println(result.get()); // Won't be printed as the "actual" processing took 2 seconds. 
    } else { 
     System.out.println("Task timed out."); 
    } 
} 
executor.shutdown(); 
+0

이것은 올바르게 차단되지 않습니까? 나 아직도 설문 조사 할 수있어? API를 읽으면 미래의 블록을 얻는다고 생각합니다. – Zombies

+0

낮은 수준에서하십시오. 어떤 방식 으로든 결과를 수집하는 스레드가 있어야합니다. – BalusC

+0

설명 좀 해 주시겠습니까? 이 코드가 해결하는 문제에 대한 일반적인 코멘트. 지금이 코드를 실행할 가능성이 없지만 정말 흥미 롭습니다. – Roman

1

MyObject에 대한 인터페이스와 적절한 Getter를 보유하고 있습니다.

당신이 스레드가 실행을 완료 할 때까지 당신이 클래스 의 구성원을 작성하고 잠시 루프를 할 수있는 변수를 반환하고자하는 경우.

관련 문제