Метод 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,
который завершает работу пула потоков