Содержание
Задумывались ли вы, как убить долго работающий поток Java ? Есть ли у вас какие-либо вопросы ниже?
- Убить / остановить поток через определенный промежуток времени
- Уничтожение потока после определенного срока в Java
- Как убить нить Java
- Как остановить поток в Java на примере
- как остановить поток в примере кода Java
- Как остановить поток в Java без использования метода остановки
Если у вас есть какие-либо из нижеперечисленных вопросов, то вы попали по адресу. Сегодня мы рассмотрим простой пример, который демонстрирует способы уничтожения длинных потоков в Java8 .
Что такое логика:
- Создать класс CrunchifyJavaTaskTimeout.java
- Создать исполнителя Java Thread только с одним размером пула потоков .
- Создайте 4 будущих задания
CrunchifyRunnerобъект с таймаутом 3 секунды - CrunchifyRunner.java — это простой класс, который реализует
call()метод- Вводит
20 secondsзадержать, еслиfutureTask = 4
- Вводит
- Однажды будущие хиты
3 secondsвремя создает исключение тайм-аута, если поток все еще работает- Когда время истекло, нам нужно отменить задачу, используя crunchifyFuture.
cancel(true); - Как только futureTask отменен, он сработает
InterruptedException(Брошенный, когда поток ожидает , спит или иным образом занят, и поток прерывается , или до, или во время действия. Иногда метод может захотеть проверить, был ли текущий поток прерван, и если так, немедленно бросить это исключение.)
- Когда время истекло, нам нужно отменить задачу, используя crunchifyFuture.
Давайте начнем:
Шаг 1 Создайте класс CrunchifyRunner.java
CrunchifyRunner.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
|
пакет crunchify. Java. учебные пособия ;
импорт Java . текст. SimpleDateFormat ;
импорт Java . Util. Дата ;
импорт Java . Util. одновременно. Вызываемый ;
/ **
* @author Crunchify.com
* Версия: 1.0.1
*
* /
общественности учебный класс CrunchifyRunner инвентарь Callable < логическое значение > {
частный ИНТ workerNumber ;
общественности ИНТ getNumber ( ) {
вернуть workerNumber ;
}
общественности недействительным setNumber ( int workerNumber ) {
это. workerNumber знак равно workerNumber ;
}
общественности CrunchifyRunner ( int workerNumber ) {
это. workerNumber знак равно workerNumber ;
setNumber ( workerNumber ) ;
}
SimpleDateFormat crunchifyFormatter знак равно новый SimpleDateFormat ( ДД-МММММ-гггг чч: мм: сс ) ;
общественности логический вызов ( ) бросает InterruptedException {
пытаться {
если ( workerNumber == 4 ) {
// Спим в течение 20 секунд, чтобы создать долго работающий поток.
Thread. сон ( 20000 ) ;
} еще {
Thread. сон ( 50 ) ;
}
} ловить ( InterruptedException т.е. ) {
log ( / n + crunchifyFormatter . формат ( новый Дата ( ) ) + «Задача crunchifyWorker» + workerNumber + прервано ) ;
log ( / n =======> Обычно после истечения времени ожидания потока его следует отменить и прервать. (timedout ==> отменено ==> прервано) ) ;
}
// Брошенный, когда поток ожидает, спит или иным образом занят, и поток прерывается, или до или во время действия. Изредка
// метод может захотеть проверить, был ли текущий поток прерван, и если да, немедленно вызвать это исключение.
вернуть правда ;
}
общественности недействительным log ( Строка информация ) {
Система. вне. println ( информация ) ;
}
}
|
Шаг 2 Создайте класс CrunchifyJavaTaskTimeout.java
CrunchifyJavaTaskTimeout.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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
пакет crunchify. Java. учебные пособия ;
импорт Java . текст. SimpleDateFormat ;
импорт Java . Util. ArrayList ;
импорт Java . Util. Коллекция ;
импорт Java . Util. Дата ;
импорт Java . Util. Список ;
импорт Java . Util. одновременно. Вызываемый ;
импорт Java . Util. одновременно. CompletionService ;
импорт Java . Util. одновременно. ExecutionException ;
импорт Java . Util. одновременно. ExecutorCompletionService ;
импорт Java . Util. одновременно. Исполнители ;
импорт Java . Util. одновременно. Будущее ;
импорт Java . Util. одновременно. TimeUnit ;
/ **
* @author Crunchify.com
* Версия: 1.0.2
*
* /
общественности учебный класс CrunchifyJavaTaskTimeout {
@ SuppressWarnings ( { rawtypes , «бесконтрольно» } )
общественности статический недействительным основной ( окончательный Строка [ ] аргументы ) {
// Создает ExecutorCompletionService, используя предоставленного исполнителя для выполнения базовой задачи и LinkedBlockingQueue в качестве очереди завершения.
CompletionService < Boolean > crunchifyService знак равно новый ExecutorCompletionService < Boolean > ( Executors . NewFixedThreadPool ( 1 ) ) ;
Коллекция < CrunchifyRunner > crunchifyThreads знак равно новый ArrayList < CrunchifyRunner > ( 50 ) ;
crunchifyThreads . добавить ( новый CrunchifyRunner ( 1 ) ) ;
crunchifyThreads . добавить ( новый CrunchifyRunner ( 2 ) ) ;
crunchifyThreads . добавить ( новый CrunchifyRunner ( 3 ) ) ;
crunchifyThreads . добавить ( новый CrunchifyRunner ( 4 ) ) ;
SimpleDateFormat crunchifyFormatter знак равно новый SimpleDateFormat ( ДД-МММММ-гггг чч: мм: сс ) ;
Список
пытаться {
// Давайте сначала добавим все задачи в будущее
за ( Callable crunchifyTask : crunchifyThreads ) {
crunchifyFutures . add ( crunchifyService . submit ( crunchifyTask ) ) ;
}
за ( int подсчитывать знак равно 1 ; подсчитывать < = crunchifyFutures . размер ( ) ; считать ++ ) {
// Давайте установим Fout timeout на 3 секунды
Будущее < Boolean > crunchifyResult знак равно crunchifyService . опрос ( 3000 , TimeUnit . МИЛЛИСЕКУНДЫ ) ;
если ( crunchifyResult == ноль ) {
log ( crunchifyFormatter . format ( new) Дата ( ) ) + / n ==> задача crunchifyWorker + подсчитывать + время вышло. ) ;
// Итак, давайте отменим первые фьючерсы, которые мы находим, которые не завершили
за ( Будущее crunchifyFuture : crunchifyFutures ) {
если ( crunchifyFuture . isDone ( ) ) {
продолжить ;
} еще {
crunchifyFuture . отменить ( правда ) ;
log ( ==> задача crunchifyWorker + подсчитывать + отменено. ) ;
перерыв ;
}
}
продолжить ;
} еще {
пытаться {
если ( crunchifyResult . isDone ( ) &&! crunchifyResult.isCancelled () && crunchifyResult.get ()) {
log (crunchifyFormatter.format (new Date ()) + ==> задача crunchifyWorker + count + выполнено.);
} еще {
log ( crunchifyFormatter . format ( new) Дата ( ) ) + ==> задача crunchifyWorker не выполнена ) ;
}
} ловить ( Исключение ExecutionException ) {
log ( исключение . getMessage ( ) ) ;
}
}
}
} ловить ( Исключение InterruptedException ) {
// Записать сообщение об исключении
log ( исключение . getMessage ( ) ) ;
} в конце концов {
// Отмена, прерывая любые существующие задачи, в настоящее время выполняющиеся в Executor Service
за ( Future < Boolean > будущее : crunchifyFutures ) {
будущее. отменить ( правда ) ;
}
}
log ( / n =======> Все задачи выполнены. Теперь долго работающий поток 4 должен прерываться сразу после этого. ) ;
Система. выход ( 0 ) ;
}
частный статический недействительным log ( Строка строка ) {
Система. вне. println ( строка ) ;
}
}
|
Шаг 3
Щелкните правой кнопкой мыши CrunchifyJavaTaskTimeout.java и запустите его как приложение Java .
Ниже вы увидите результат в консоли Eclipse .
|
1
2
3
4
5
6
7
8
9
10
11
12
|
27 ноября — 2018 10 : 32 : 29 == > задача crunchifyWorker 1 завершено.
27 ноября — 2018 10 : 32 : 29 == > задача crunchifyWorker 2 завершено.
27 ноября — 2018 10 : 32 : 29 == > задача crunchifyWorker 3 завершено.
27 ноября — 2018 10 : 32 : 32
== > задача crunchifyWorker 4 timedout.
== > задача crunchifyWorker 4 отменен.
======= > Все задачи выполнены . Теперь долго бегущая нить 4 должно быть прервано сразу же после этого.
27 ноября — 2018 10 : 32 : 32 задача crunchifyWorker 4 прерываться.
======= > В основном , как только поток тайм- аут , это должно быть отменено и прерываться. ( тайм-аут == > отменен == > прервано )
|
Дайте мне знать, если у вас есть какие-либо вопросы по этой теме.
0.00 (0%) 0 votes









