Java'da tamamlanmış bir gelecek nasıl oluşturulur


87

Java'da tamamlanmış bir gelecek inşa etmenin en iyi yolu nedir? CompletedFutureAşağıda kendiminkini uyguladım , ancak bunun gibi bir şeyin zaten var olmasını umuyordum.

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
En iyi yol, bir tane yaratmamaktır! ;-) Neden bir Geleceği uygulamaya ihtiyacınız var? Bunun yerine bir gelecek döndüren mevcut nesneleri kullanamaz mısınız?
assylias

1
Hiçbirinin olmadığından şüpheleniyorum çünkü sahip olmak için bir neden görmedim. Belki ne yapmaya çalıştığını açıklayabilirsin?
Peter Lawrey

1
@PeterLawrey Sanırım bazı API'ler için buna ihtiyacı var ki, bazı sapkın sebeplerden dolayı, gerçekten sadece değerlerine ihtiyaç duymasına rağmen gelecekle çalışmak istiyor. Ya da alay etmek için buna ihtiyacı var. En azından hayal edebildiğim tek sebep bu.
Kübik

9
Birim testleri, bunu istemek için mükemmel bir neden olacaktır - test değerleriyle bir geleceği geri getiren alay konusu bir hizmet.
Louis Wasserman

3
@Cubic. Çağrılabilir <T> 'yi kabul eden ve işi mevcut kaynaklara veya çok daha önce sağlanan seçenekler gibi diğer faktörlere bağlı olarak eşzamansız olarak çalıştırabilen veya çalıştırmayan bir yönteminiz olsaydı nasıl olur? Executor.execute (Runnable) ' ın parametre olarak bir Callable <T> alıp çalıştırma iş parçacığında çalıştırmaya karar verdiğini düşünün , o zaman uygulamanın kendi Future <T>' sini yaratması gerekmez mi?
Martin Andersson

Yanıtlar:


66

Apache Commons Lang, ConstantFuture adı verilen benzer bir uygulamayı tanımlar, şunu arayarak elde edebilirsiniz:

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

Aşağıdaki
Andrejs'in

201

Java 8'de yerleşik CompletableFuture'u kullanabilirsiniz:

 Future future = CompletableFuture.completedFuture(value);

Bu size tamamlanmış bir gelecek verecektir. Bunun yerine yeni CompletableFuture () kullanın.
zafar142003

8
@ zafar142003 OP tamamlanmış bir gelecek istedi, değil mi?
Andrejs

Soru ayrıntılarında sınıfa göre değerlendirildiğinde (2012'de), OP'nin bir 'CompletableFuture' uygulamasını istediğini düşünüyorum. Ama sanırım, bu artık tartışmalı bir konu.
zafar142003

Soru ayrıntılarında sınıfa bakıldığında, OP'nin anlık değeri olan bir Geleceği istiyormuş gibi görünüyor. Bunun isDoneher zaman doğru olduğunu görün . Bu nedenle, bu mükemmel bir cevaptır.
nathanfranke


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

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

"foo" yazdıracak;

Ayrıca get () çağrıldığında bir istisna atan bir Future'a da sahip olabilirsiniz:

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

-3

Java rt.jar içinde sizinkine çok benzer bir sınıf buldum

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

Ayrıca get () çağrıldığında atılabilecek bir istisna belirtmenize de izin verir. Bir istisna atmak istemiyorsanız bunu null olarak ayarlayın.


2
Genel olarak, com.sun.*paketteki herhangi bir şeyi kullanmak harika bir fikir değildir. Bu sınıflar genellikle dahili bir uygulama ayrıntısı olarak kabul edilir ve Java'nın sürümleri arasında değişiklik gösterebilir.
James Kingsbery

-6

Java 6'da aşağıdakileri kullanabilirsiniz:

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

3
Bunun Java çekirdek kitaplıklarında olduğunu sanmıyorum. Hangi dış bağımlılığı kullanıyor?
Jorn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.