Каллируемые и будущие интерфейсы
Callable - это интерфейс, аналогичный запускающемуся.
Существует несколько различий между вызовом и запускаемым:
(1) Метод, указанный Callable, является Call (), в то время как метод, указанный с помощью Runnable, run ().
(2) Задача Callable может вернуть значение после его выполнения, в то время как выполняемая задача не может вернуть значение.
(3) Метод Call () может бросить исключения, в то время как метод run () не может бросить исключения.
(4) Запустите задачу, и вы можете получить будущее.
Он предоставляет метод, чтобы проверить, завершен ли расчет, ожидание заполнения расчета и получения результатов расчета.
Через будущий объект вы можете понять статус выполнения задачи, отменить выполнение задачи, а также получить результаты выполнения задачи.
Кода -копия выглядит следующим образом:
пакет com.yao;
импортировать java.util.concurrent.callable;
импортировать java.util.concurrent.executorservice;
импортировать java.util.concurrent.executors;
импортировать java.util.concurrent.future;
открытый класс callableAndfuture {
/**
* Настройка класса задач для реализации разбираемого интерфейса
*/
Публичный статический класс mycallableclass реализует Callable {
// позиция логотипа
private int flag = 0;
public mycallableclass (int flag) {
this.flag = flag;
}
public String call () бросает исключение {
if (this.flag == 0) {
// Если значение флага составляет 0, немедленно верните
вернуть "flag = 0";
}
if (this.flag == 1) {
// Если значение флага составляет 1, сделайте бесконечную петлю
пытаться {
while (true) {
System.out.println ("Looping ...");
Thread.sleep (2000);
}
} catch (прерванная экспрессия e) {
System.out.println ("прерван");
}
вернуть "false";
} еще {
// Если ложь не 0 или 1, будет брошено исключение
бросить новое исключение («Значение плохого флага!»);
}
}
}
public static void main (string [] args) {
// Определите 3 каллируемых типа задач
Mycallableclass task1 = new MyCallableClass (0);
Mycallableclass task2 = new MyCallableClass (1);
Mycallableclass task3 = new MyCallableClass (2);
// Создать сервис, который выполняет задачи
Executorservice es = executors.newfixedthreadpool (3);
пытаться {
// Отправить и выполнить задачу.
// Если вы хотите получить результат выполнения задачи или исключения, вы можете работать на этом будущем объекте
Future Future1 = es.submit (task1);
// Получить результат первой задачи.
System.out.println ("task1:" + future1.get ());
Future Future2 = es.submit (task2);
// ждать 5 секунд, прежде чем остановить вторую задачу. Потому что вторая задача - бесконечная петля
Thread.sleep (5000);
System.out.println ("task2 Cancel:" + future2.cancel (true));
// Получить вывод третьей задачи, потому что выполнение третьей задачи вызовет исключение
// Таким образом, следующее утверждение приведет к тому, что исключение будет брошено
Future Future3 = ES.Submit (Task3);
System.out.println ("task3:" + future3.get ());
} catch (Exception e) {
System.out.println (e.toString ());
}
// Остановить службу выполнения задачи
es.shutdownnow ();
}
}