2016-06-01 4 views
2

Новое для отправки метода параллельной структуры Java. Хотите узнать, был ли поток выполнен, когда я вызываю submit или когда я вызываю get? Исследуемый официальный документ Oracle, но не может найти слишком много информации. Благодарю.submit метод параллельной структуры Java

Я имею в виду ниже образца,

http://www.vogella.com/tutorials/JavaConcurrency/article.html

package de.vogella.concurrency.callables; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.concurrent.Callable; 
import java.util.concurrent.ExecutionException; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.Future; 

public class CallableFutures { 
    private static final int NTHREDS = 10; 

    public static void main(String[] args) { 

    ExecutorService executor = Executors.newFixedThreadPool(NTHREDS); 
    List<Future<Long>> list = new ArrayList<Future<Long>>(); 
    for (int i = 0; i < 20000; i++) { 
     Callable<Long> worker = new MyCallable(); 
     Future<Long> submit = executor.submit(worker); 
     list.add(submit); 
    } 
    long sum = 0; 
    System.out.println(list.size()); 
    // now retrieve the result 
    for (Future<Long> future : list) { 
     try { 
     sum += future.get(); 
     } catch (InterruptedException e) { 
     e.printStackTrace(); 
     } catch (ExecutionException e) { 
     e.printStackTrace(); 
     } 
    } 
    System.out.println(sum); 
    executor.shutdown(); 
    } 
} 
+1

Это объясняется в javadoc: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool-int- –

+0

@JBNizet, проголосуйте за ответ , и я прочитал этот документ. В явном виде не указано, выполняется ли при выполнении задачи (учитывая простой случай, имеется достаточное количество активных потоков, чем количество выполняемых задач). Моя догадка из документа заключается в том, что задача выполняется, когда я отправляю, но я не уверен, поэтому я пришел сюда, чтобы спросить. Ваш совет приветствуется. –

+2

Если имеется поток (т. Е. Очередь пуста), то задача выполняется немедленно. В противном случае он помещается в очередь до тех пор, пока поток не будет доступен. –

ответ

6

Нет, призывая представить не выполнить поставленную задачу. И вызов get не выполняет задачу. Задача обрабатывается асинхронно в потоке, принадлежащем потоку threader исполнителя.

Вызов метода отправки дает задачу для потока. Задача ставится в очередь, пока один из потоков в пуле не будет бесплатным. Затем пул назначает задачу рабочему потоку, который вызывает код.

Когда вы звоните в Future.get, либо рабочий закончил обработку вашей задачи, рабочий обрабатывает вашу задачу, либо задача все еще находится в очереди, ожидая, когда рабочий станет доступным. Если ваша задача выполнена, то будущее возвращает значение, возвращаемое из задачи Callable, иначе вызов метода get в будущем заставит ваш основной поток блокироваться до завершения задачи.

+0

Спасибо Натан, проголосуйте. Если есть более активные потоки, чем количество задач, я думаю, что задача будет выполняться при отправке (кроме того, что выполняется при выполнении метода 'get'), правильно? –

+1

@LinMa: он все еще попадает в очередь, для рабочего процесса просто требуется просто время, чтобы начать обработку задачи. я думаю, что все же полезно признать разделение труда, поэтому я ответил, что вызов submit не выполняет (непосредственно) выполнение задачи. –

1

Метод submit() отправляет вашу задачу в пул потоков, в то время как Future#get() делает текущий поток до тех пор, пока задача не будет выполнена одним потоком пула независимо от того, что он терпит неудачу или нет.

+0

Спасибо Николасу, проголосуйте. Если есть более активные потоки, чем количество задач, я думаю, что задача будет выполняться при отправке (кроме того, что выполняется при выполнении метода 'get'), правильно? –

+0

это зависит от политики отклонения пула потоков, а точнее, в вашем случае –

+1

- это исключение, если все потоки используются и очередь заполнена. –