РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1051 of 1163 menu

Метод submit

Метод submit класса ExecutorService отправляет задачу на выполнение в пул потоков. В отличие от метода execute, метод submit возвращает объект Future, который позволяет получить результат выполнения задачи, дождаться ее завершения или отменить ее. В первый параметр мы передаем задачу - объект Runnable или Callable. Если передается Callable, то он может вернуть результат, а также выбросить исключение. Если передается Runnable, то объект Future вернет null после завершения задачи.

Синтаксис

Future<?> submit(Runnable task) Future<T> submit(Callable<T> task) Future<T> submit(Runnable task, T result)

Пример

Давайте отправим задачу типа Callable в пул из одного потока и получим результат через объект Future:

import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.Callable; public class Main { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(new Callable<Integer>() { public Integer call() { return 2 + 3; } }); Integer res = future.get(); System.out.println(res); executor.shutdown(); } }

Результат выполнения кода:

5

Пример

Давайте отправим задачу типа Runnable и дождемся ее завершения. Метод get вернет null, так как Runnable не возвращает результат:

import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class Main { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<?> future = executor.submit(new Runnable() { public void run() { System.out.println("task is running"); } }); Object res = future.get(); System.out.println(res); executor.shutdown(); } }

Результат выполнения кода:

"task is running" null

Пример

Давайте отправим в пул несколько задач и получим результаты через список объектов Future:

import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.Callable; public class Main { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newFixedThreadPool(2); List<Future<Integer>> futures = new ArrayList<>(); for (int i = 1; i <= 3; i++) { final int num = i; futures.add(executor.submit(new Callable<Integer>() { public Integer call() { return num * num; } })); } for (Future<Integer> future : futures) { System.out.println(future.get()); } executor.shutdown(); } }

Результат выполнения кода:

1 4 9

Смотрите также

  • класс ExecutorService,
    который управляет пулом потоков
  • метод execute,
    который запускает задачу без возврата результата
  • метод invokeAll,
    который выполняет список задач и возвращает список Future
  • метод shutdown,
    который завершает работу пула потоков
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить