Как FutureTask в коллекции работает внутри?

Я пытаюсь понять, как работает FutureTask в Collections. Из того, что я прочитал, я понимаю, что вы можете создать пул потоков, используя ExecutorService. Позже вы можете заключить Runnable или Callable в FutureTask и выполнить его. После этого вы можете использовать объект Future для проверки получения результатов или проверки выполнения задачи. Но как это сделать внутри?

Я пытаюсь понять, что происходит за кулисами, когда вы передаете интерфейс Callable. У меня есть несколько вопросов

  1. Сам FutureTask запускает поток внутри, чтобы постоянно проверять, завершила ли команда Callable выполнение? Если нет, то как узнать, когда команда завершена?

  2. Как работает метод get ()? Как он получает значение, возвращаемое из интерфейса Callable?

Глядя на документацию, я не мог понять многого. Есть ли какой-нибудь пример кода, на который я могу взглянуть, чтобы понять, что происходит за кулисами.


person krs8888    schedule 15.10.2016    source источник


Ответы (1)


Просмотрите веб-сайт grepcode, и вы получите ответы.

Интерфейс ExecutorService, который реализуется AbstractExecutorService имеет следующую реализацию для метода submit ().

public <T> Future<T> submit(Callable<T> task) {
    if (task == null) throw new NullPointerException();
    RunnableFuture<T> ftask = newTaskFor(task);
    execute(ftask);
    return ftask;
}

protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
    return new FutureTask<T>(callable);
}

grepcode для Executor предоставляет различные реализации execute метода.

grepcode для FutureTask

public FutureTask(Callable<V> callable) {
    if (callable == null)
        throw new NullPointerException();
    sync = new Sync(callable);
}


private final class Sync extends AbstractQueuedSynchronizer {
    Sync(Callable<V> callable) {
        this.callable = callable;
    }
}

public V get() throws InterruptedException, ExecutionException {
    return sync.innerGet();
} 

V innerGet() throws InterruptedException, ExecutionException {
        acquireSharedInterruptibly(0);
        if (getState() == CANCELLED)
            throw new CancellationException();
        if (exception != null)
            throw new ExecutionException(exception);
        return result;
    }
person Ravindra babu    schedule 16.10.2016