대신 사용 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();
이것은 올바르게 차단되지 않습니까? 나 아직도 설문 조사 할 수있어? API를 읽으면 미래의 블록을 얻는다고 생각합니다. – Zombies
낮은 수준에서하십시오. 어떤 방식 으로든 결과를 수집하는 스레드가 있어야합니다. – BalusC
설명 좀 해 주시겠습니까? 이 코드가 해결하는 문제에 대한 일반적인 코멘트. 지금이 코드를 실행할 가능성이 없지만 정말 흥미 롭습니다. – Roman