2017-05-15 57 views

cevap

1

Çünkü sadece çalıştırın. Future<Void> submit(Runnable task)new Thread(runnable).start() ile aynı şekilde çalışır, null'un dönüşü bazı durumlar için anlamlıdır.

Düzenleme: Bir iş parçacığını 20 dakika sonra kapatmanız gerektiğini düşünün. void dönüş değeri olduğunda bunu nasıl yaparsınız? future üzerinde hiçbir dönüş olmadığı için

Future<Void> future = execService.submit(operation); 
execService.shutdown(); 
opResult = future.get(20, TimeUnit.MINUTES); 

Bu kod hata vermek zorundadır. Ama eğer bir null döndürürse execService denetleyici nesnesi, shutdown'un olduğunu bilir. Ya da 20 dakika içinde hiçbir şey döndürmezse execService.shutdownNow() kullanılabilir.

+1

bunu değiştirerek. – starikoff

+0

Void'i çağrı yönteminden nasıl geri döndürebilirsiniz? –

+1

'Void yöntemi() {return null; } – starikoff

1

Runnable ürünününyönteminin void ilkel ve Void türünü döndürdüğüne dikkat edin. Bu nedenle, Future, Void tipine sahip olamaz ve çözüm, bunu bir joker karakter yapmaktı. Future'un java 1.5 olduğunu, Runnable ise 1.0 olduğunu unutmayın. Eski kod nedenlerinden dolayı Future'a uygun run dönüş türünü değiştiremezler.

+0

'Gelecek ' yönteminin her zaman bu durumda tam olarak ne istenir 'null' döndürecektir. 'Gelecek ',' submit' yönteminin javadoc'unda belirtildiği gibi, bu durumda, her zaman 'null' değerini döndürdüğünde, herhangi bir nesneyi döndürebilir. Yani Gelecek ' Burada doğru seçim olurdu.Benzer şekilde, eğer 'run', '' double'''nın geleceğini if ​​Gelecek '' yerine bir 'Future '' yerine uygun olurdu. – Roland

1

Jdk 1.8 içinde gönderme yöntemi uygulama void jdk1.6 iken Nesne kullanıldı. Anlayışım daha uygun çünkü bu jdk1.7/1.8'de değiştirildi.

public Future<?> submit(Runnable task) { 
     if (task == null) throw new NullPointerException(); 
     RunnableFuture<Void> ftask = newTaskFor(task, null); 
     execute(ftask); 
     return ftask; 
    } 

ve idiyse şimdi yaptığı gibi `Gelecek `, tam olarak aynı şekilde çalışacak JDK 1,6

public Future<?> submit(Runnable task) { 
     if (task == null) throw new NullPointerException(); 
     RunnableFuture<Object> ftask = newTaskFor(task, null); 
     execute(ftask); 
     return ftask; 
    } 
+0

Evet, daha sonra arayüzü değiştirmek istemediklerini anlıyorum. Ama neden ilk başta olduğu gibi tanımlandı? Void türü, [Java 1.1] 'den beri mevcuttu (https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html). Yani sanırım bu sadece bir hataydı. – Roland

İlgili konular