1. 程式人生 > >java 非同步任務佇列執行--需要注意的地方

java 非同步任務佇列執行--需要注意的地方

參照1寫的非同步任務佇列過程中,發現一些java基礎知識掌握不夠。

1)Iterable 類的forEach方法和for迴圈方法的不同:

 try {
     List<Future<Object>> futures = executor.invokeAll(tasks);
     futures.forEach(Future::get); // compiling failed. must use for(Future f: futures) {} instead
 } catch (InterruptedException | ExecutionException e) {
     e.printStackTrace();
 }

因為Future::get()方法有可捕獲的異常丟擲,違反了void forEach(Consumer<? super T> action)裡的

@FunctionalInterface
public interface Consumer<T> {

    /**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t); // does not throw catchable exceptions.

2)List<Future<Object>> futures = executor.invokeAll(tasks);提示

Collection cannot be apploy to list

因為interface List<E> extends Collection<E>所以List可以用在需要Collection引數的地方。所以問題不在這。注意到下面還有一行字:

no instance of type variable T exist so that callable conforms to Callable<T>

問題在於invokeAll介面需要Callable<T>,而tasks的宣告中沒有指明T的型別,改成:
List<Callable<Object>> tasks = new ArrayList<>(); // change Callable to Callable<Object>
並且:
public class Timer implements Callable也要相應變為:
public class Timer implements Callable<Object>
32介紹了這個錯誤的原因,以及為什麼不要使用raw type。