자바에서 완성 된 미래를 만드는 방법


82

Java로 완성 된 미래를 구성하는 가장 좋은 방법은 무엇입니까? 나는 CompletedFuture아래에서 내 자신을 구현 했지만 이미 존재하는 이와 같은 것을 바라고있었습니다.

public class CompletedFuture<T> implements Future<T> {
    private final T result;

    public CompletedFuture(final T result) {
        this.result = result;
    }

    @Override
    public boolean cancel(final boolean b) {
        return false;
    }

    @Override
    public boolean isCancelled() {
        return false;
    }

    @Override
    public boolean isDone() {
        return true;
    }

    @Override
    public T get() throws InterruptedException, ExecutionException {
        return this.result;
    }

    @Override
    public T get(final long l, final TimeUnit timeUnit) throws InterruptedException, ExecutionException, TimeoutException {
        return get();
    }
}

1
가장 좋은 방법은 생성하지 않는 것입니다! ;-) 왜 미래를 구현해야합니까? 대신 미래를 반환하는 기존 객체를 사용할 수 없습니까?
assylias dec.

1
나는 그것을 가질 이유를 본 적이 없기 때문에 존재하지 않는다고 생각합니다. 당신이하려는 일을 설명 할 수 있겠습니까?
Peter Lawrey 2012

1
@PeterLawrey 나는 그것이 실제로 값만 필요로하더라도 어떤 왜곡 된 이유로 미래와 함께 일하고 싶어하는 일부 API를 위해 그가 필요하다고 생각합니다. 아니면 조롱을 위해 필요합니다. 적어도 그것이 제가 상상할 수있는 유일한 이유입니다.
Cubic

9
단위 테스트는이를 원하는 완벽한 이유가 될 것입니다. 테스트 값으로 미래를 반환하는 모의 서비스입니다.
Louis Wasserman

3
@Cubic. Callable <T>를 받아들이는 메서드가 있고 사용 가능한 리소스 또는 이미 이전에 제공된 옵션과 같은 기타 요인에 따라 작업을 비동기 적으로 실행할 수도 있고 실행하지 않을 수도있는 사람은 어떻습니까? 상상해 Executor.execute (Runnable을)를 대신하고는 실행 스레드에서 실행하기로 결정 매개 변수로 호출 가능 <T>를했다 후 자신의 미래 <T>를 만들 구현 필요가없는 것?
Martin Andersson 2014

답변:


65

Apache Commons Lang은 ConstantFuture라는 유사한 구현을 정의합니다. 다음을 호출하여 가져올 수 있습니다.

Future<T> future = ConcurrentUtils.constantFuture(T myValue);

아래 Andrejs의 답변을 참조하십시오. 찾고있는 것이 더 많을 수 있습니다
nathanfranke

194

Java 8에서는 내장 CompletableFuture를 사용할 수 있습니다.

 Future future = CompletableFuture.completedFuture(value);

이것은 당신에게 완전한 미래를 줄 것입니다. 대신 new CompletableFuture ()를 사용하십시오.
zafar142003

8
@ zafar142003 OP는 완성 된 미래를 요구했습니다.
안드레이

질문 세부 사항 (2012 년)에서 클래스별로 판단하면 OP가 'CompletableFuture'구현을 원했다고 생각합니다. 그러나 나는 이것이 이제 논쟁의 여지가 있다고 생각합니다.
zafar142003

질문 세부 사항의 클래스로 판단하면 OP가 즉각적인 가치를 가진 Future를 원했던 것 같습니다. 볼 isDone항상 true를 반환합니다. 따라서 이것은 훌륭한 대답입니다.
nathanfranke


2
FutureTask<String> ft = new FutureTask<>(() -> "foo");
ft.run();

System.out.println(ft.get());

"foo"를 출력합니다.

get ()이 호출 될 때 예외를 발생시키는 Future를 가질 수도 있습니다.

FutureTask<String> ft = new FutureTask<>(() -> {throw new RuntimeException("exception!");});
ft.run();

-3

Java rt.jar에서 귀하와 매우 유사한 클래스를 찾았습니다.

com.sun.xml.internal.ws.util.CompletedFuture

또한 get ()이 호출 될 때 발생할 수있는 예외를 지정할 수 있습니다. 예외를 throw하지 않으려면 null로 설정하십시오.


2
일반적으로 com.sun.*패키지 에있는 것을 사용하는 것은 좋은 생각이 아닙니다. 이러한 클래스는 일반적으로 내부 구현 세부 사항으로 간주되며 Java 버전간에 변경 될 수 있습니다.
James Kingsbery

-6

Java 6에서는 다음을 사용할 수 있습니다.

Promise<T> p = new Promise<T>();
p.resolve(value);
return p.getFuture();

3
나는 그것이 Java 코어 라이브러리에 있다고 생각하지 않습니다. 어떤 외부 의존성을 사용합니까?
요른
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.