Отменяемые асинхронные вычисления. Этот класс обеспечивает базовую реализацию Future с методами для запуска и отмены вычислений запросите, завершено ли вычисление, и получите результат вычисления. Результат может быть получен только после завершения вычисления; get методы будут блокироваться, если вычисление еще не завершено. Как только вычисление завершено, вычисление не может быть перезапущено или отменено (если вычисление не вызывается с использованием runAndReset() ).
FutureTask может быть использован, чтобы обернуть Callable или же Runnable объект. Так как FutureTask инвентарь Runnable , FutureTask может быть представлен на Executor для выполнения.
В дополнение к служению в качестве отдельного класса, этот класс обеспечивает protected функциональность, которая может быть полезна при создании пользовательских классов задач.
Вот простой пример Java, в котором мы создадим два класса: CrunchifyCallable.java а также CrunchifyFutureTask.java.
Другой должен прочитать:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
пакет ком . crunchify. учебные пособия ;
Импортировать Java. Util. одновременно. ExecutionException ;
Импортировать Java. Util. одновременно. ExecutorService ;
Импортировать Java. Util. одновременно. Исполнители ;
Импортировать Java. Util. одновременно. FutureTask ;
Импортировать Java. Util. одновременно. TimeUnit ;
Импортировать Java. Util. одновременно. TimeoutException ;
/ **
* @author Crunchify.com
*
* /
общественности учебный класс CrunchifyFutureTask {
общественности статический недействительным main ( Строка [ ] аргументы ) {
CrunchifyCallable crunchifyCallable1 знак равно новый CrunchifyCallable ( 2000 ) ;
CrunchifyCallable crunchifyCallable2 знак равно новый CrunchifyCallable ( 4000 ) ;
FutureTask
crunchifyCallable1 ) ;
FutureTask
crunchifyCallable2 ) ;
// Создает пул потоков, который повторно использует фиксированное количество работающих потоков
// вне общей неограниченной очереди. В любой момент не более nThreads потоков
// будут активные задачи обработки.
ExecutorService executor знак равно Исполнители . newFixedThreadPool ( 2 ) ;
исполнитель. выполнить ( futureTask1 ) ;
исполнитель. выполнить ( futureTask2 ) ;
в то время как ( правда ) {
пытаться {
если ( futureTask1 . isDone ( ) && futureTask2.isDone ()) {
System.out.println ( Готово);
// Инициирует упорядоченное отключение, при котором ранее
// представленные задачи выполнены, но новых задач не будет
// принято. Вызов не имеет никакого дополнительного эффекта, если уже
// неисправность.
исполнитель. выключение ( ) ;
возврат ;
}
если ( ! futureTask2 . isDone ( ) ) {
// бесконечно ждем завершения задачи
Система. вне. println ( FutureTask1 output =
+ futureTask1 . get ( ) ) ;
}
Система. вне. println ( «Ожидание завершения FutureTask1» ) ;
строка s знак равно futureTask2 . получить ( 200л , TimeUnit . МИЛЛИСЕКУНДЫ ) ;
если ( с ! знак равно ноль ) {
Система. вне. println ( FutureTask1 output = + с ) ;
}
} ловить ( InterruptedException | ExecutionException е ) {
эл . printStackTrace ( ) ;
} ловить ( TimeoutException е ) {
// исключение
}
}
}
}
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
пакет ком . crunchify. учебные пособия ;
Импортировать Java. Util. одновременно. Вызываемый ;
/ **
* @author Crunchify.com
*
* /
общественности учебный класс CrunchifyCallable инвентарь Вызываемый
частный долго waitTime ;
общественности CrunchifyCallable ( int время ) {
это. время ожидания знак равно время ;
}
@Override
общественности строка вызов ( ) бросает исключение {
Thread. сон ( waitTime ) ;
вернуть Thread. currentThread ( ) . getName ( ) ;
}
}
|
Выход:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Выход FutureTask1 = пул — 1 — поток — 1
Ожидание FutureTask1 to полный
Выход FutureTask1 = пул — 1 — поток — 1
Ожидание FutureTask1 to полный
Выход FutureTask1 = пул — 1 — поток — 1
Ожидание FutureTask1 to полный
Выход FutureTask1 = пул — 1 — поток — 1
Ожидание FutureTask1 to полный
Выход FutureTask1 = пул — 1 — поток — 1
Ожидание FutureTask1 to полный
Выход FutureTask1 = пул — 1 — поток — 2
Готово
|
0.00 (0%) 0 votes








