Домой Учебники по Java и J2EE Как запускать несколько потоков одновременно в Java? Подход ExecutorService

Как запускать несколько потоков одновременно в Java? Подход ExecutorService

767
0

Давайте еще раз посмотрим на этот пример: как получить Ping-статус любой конечной точки HTTP в Java?

Вы заметили выполнение потока для этого примера? Это последовательно. What if you have 500 endpoints? Бьюсь об заклад, вы должны подождать не менее 5 минут, чтобы получить результат. Что, я уверен, не лучшее решение.

Что теперь? Правильный вопрос будет:

  • Как запустить несколько потоков одновременно?
  • Как реализовать несколько потоков в Java ?
  • Как мне запустить разные потоки в Java?
  • Java — Где находится учебник по многопоточному программированию?
  • Тема: Как использовать несколько потоков для ускорения обработки?

ExecutorService Approach это твой ответ.

Исполнитель, который предоставляет методы для управления завершением и методы, которые могут создать будущее для отслеживания хода выполнения одной или нескольких асинхронных задач .

Служба ExecutorService может быть закрыта, что приведет к отклонению новых задач. Для выключения ExecutorService предусмотрены два разных метода. shutdown() метод позволит выполнить ранее отправленные задачи до завершения, а shutdownNow() Этот метод предотвращает запуск ожидающих задач и пытается остановить выполнение текущих задач.

По окончании у исполнителя нет задач, которые активно выполняются, задач, ожидающих выполнения, и новые задачи не могут быть отправлены. Неиспользуемый ExecutorService должен быть закрыт, чтобы разрешить восстановление его ресурсов .

Метод submit расширяет базовый метод Executor.execute  ( java.lang.Runnable ) путем создания и возврата Future, который можно использовать для отмены выполнения и / или ожидания завершения. методы invokeAny а также invokeAll выполнять наиболее часто используемые формы массового выполнения, выполняя набор задач, а затем ожидая завершения хотя бы одного или всех. (Класс ExecutorCompletionService может использоваться для написания индивидуальных вариантов этих методов .)

Класс Executors предоставляет фабричные методы для служб executor, предоставляемых в этом пакете.

  • ExecutorService, как ждать завершения всех задач?
  • Руководство по Java ExecutorService
  • Пул потоков Java — объяснение ExecutorService

Ниже приведен простой пример Java, который объясняет usage of ExecutorService ,

CrunchifyGetPingStatusWithExecutorService.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
пакет crunchify. ком . учебные пособия ;
Импортировать Java. нетто. HttpURLConnection ;
Импортировать Java. нетто. URL ;
Импортировать Java. Util. одновременно. ExecutorService ;
Импортировать Java. Util. одновременно. Исполнители ;
/ **
* @author Crunchify.com
*
* /
общественности учебный класс CrunchifyGetPingStatusWithExecutorService {
частный статический окончательный ИНТ MYTHREADS знак равно 30 ;
общественности статический недействительным главная ( Строка args [ ] ) бросает исключение {
ExecutorService executor знак равно Исполнители . newFixedThreadPool ( MYTHREADS ) ;
Строка [ ] списке_узлов знак равно { http://crunchify.com , http://yahoo.com , http://www.ebay.com , http://google.com ,
http://www.example.co , https://paypal.com , http://bing.com/ , http://techcrunch.com/ , http://mashable.com/ ,
http://thenextweb.com/ , http://wordpress.com/ , http://wordpress.org/ , http://example.com/ , http://sjsu.edu/ ,
http://ebay.co.uk/ , http://google123.co.uk/ , http://wikipedia.org/ , http://en.wikipedia.org } ;
за ( int я знак равно 0 ; я < hostList . длина ; я ++ ) {
строка URL знак равно hostList [ i ] ;
Работающий работник знак равно новый MyRunnable ( url ) ;
исполнитель. выполнить ( рабочий ) ;
}
исполнитель. выключение ( ) ;
// Дождемся окончания всех потоков
в то время как ( ! executor . isTermination ( ) ) {
}
Система. вне. println ( / nFinished all threads ) ;
}
общественности статический учебный класс MyRunnable инвентарь Runnable {
частный окончательный строка URL ;
MyRunnable ( Строка URL ) {
это. URL знак равно URL ;
}
@Override
общественности недействительным запустить ( ) {
строка результат знак равно ;
ИНТ код знак равно 200 ;
пытаться {
URL siteURL знак равно новый URL ( URL ) ;
подключение HttpURLConnection знак равно ( HttpURLConnection ) siteURL . openConnection ( ) ;
подключение. setRequestMethod ( GET ) ;
подключение. setConnectTimeout ( 3000 ) ;
подключение. подключиться ( ) ;
код знак равно подключение. getResponseCode ( ) ;
если ( код == 200 ) {
результат знак равно -> Зеленый <- / t + Код: + код ;
;
} еще {
результат знак равно -> Желтый <- / t + Код: + код ;
}
} ловить ( Исключение е ) {
результат знак равно -> Красный <- / t + «Неправильный домен — исключение:» + эл . getMessage ( ) ;
}
Система. вне. println ( url + / т / tStatus: + результат ) ;
}
}
}

Выход:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
http : //www.example.co Статус: -> Красный <- Неправильный домен - Исключение: www.example.co
http : //google123.co.uk/ Статус: -> Красный <- Неправильный домен - Исключение: google123.co.uk
http : //mashable.com/ Статус: -> Желтый <- Код: 301
http : //techcrunch.com/ Статус: -> Желтый <- Код: 301
http : //example.com/ Статус: -> Зеленый <- Код: 200
http : //wikipedia.org/ Статус: -> Желтый <- Код: 301
http : //en.wikipedia.org Статус: -> Желтый <- Код: 301
http : //wordpress.com/ Статус: -> Желтый <- Код: 301
http : //ebay.co.uk/ Статус: -> Желтый <- Код: 301
http : //yahoo.com Статус: -> Желтый <- Код: 301
http : //www.ebay.com Статус: -> Желтый <- Код: 301
http : //wordpress.org/ Статус: -> Желтый <- Код: 301
http : //google.com Статус: -> Зеленый <- Код: 200
http : //crunchify.com Статус: -> Желтый <- Код: 301
http : //thenextweb.com/ Статус: -> Желтый <- Код: 301
http : //bing.com/ Статус: -> Зеленый <- Код: 200
https : //paypal.com Статус: -> Зеленый <- Код: 200
http : //sjsu.edu/ Статус: -> Красный <- Неправильный домен - Исключение: истекло время соединения
Закончили все темы

Теперь зацените результат. Это должно быть в считанные секунды. Я надеюсь, что вы найдете это полезным. Попробуйте выполнить это более одного раза, и вы можете увидеть разные результаты, так как все потоки выполняются в параллелях, и кто когда-либо получит быстрый результат, вы увидите результат, опубликованный в консоли Eclipse .

ЧИТАТЬ ТАКЖЕ:  Как проверить адрес электронной почты, используя Java Mail API?

Дайте мне знать по любому запросу.

Как запускать несколько потоков одновременно в Java? Подход ExecutorService

0.00 (0%) 0 votes

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь