28 Гугл 1 Как получить список живых нитей из группы ThreadGroup? Как получить список мертвых нитей из группы ThreadGroup? Аналоги ThreadPoolExecutor? Что такое ThreadWorker? Что такое ThreadPool?

 

28. 1. Як отримати список живих ниток з групи ThreadGroup?

Метод public int enumerate(Thread[] list)
Копіює у вказаний масив кожен активний програмний потік (нитку) у цій групі 
потоків та її підгрупах. Виклик цього методу поводиться точно так само, 
як і виклик enumerate(list, true). 
Параметри: list - масив, у який потрібно помістити список потоків
Повертає: кількість потоків, поміщених у масив
Винятки: SecurityException - якщо checkAccess визначає, що поточний потік 
не може отримати доступ до цієї групи потоків

                              

Метод public int enumerate(Thread[] list, boolean recurse)
Копіює у вказаний масив кожен активний потік у цій групі потоків. 
Якщо рекурсія має значення true, цей метод рекурсивно перераховує всі 
підгрупи цієї групи потоків і також включає посилання на кожен активний 
потік у цих підгрупах. Якщо масив занадто короткий, щоб вмістити всі потоки, 
додаткові потоки ігноруються.
Програма може використовувати метод activeCount, щоб отримати оцінку розміру 
масиву, однак, якщо масив закороткий, щоб умістити всі потоки, додаткові 
потоки мовчки ігноруються. Якщо критично важливо отримати кожен активний 
потік у цій групі потоків, потрібно переконатися, що повернуте значення int 
є строго меншим за довжину списку. Через притаманну цьому методу конкуренцію, 
рекомендується використовувати цей метод лише для налагодження та моніторингу.

Параметри: list - масив, у який потрібно помістити список потоків
recurse - якщо true, рекурсивно перерахувати всі підгрупи цієї групи потоків
Повертає: кількість потоків, поміщених у масив

Винятки: SecurityException - якщо checkAccess визначає, що поточний потік не 
може отримати доступ до цієї групи потоків

 

ThreadGroup threadGroup = Thread.currentThread().getThreadGroup(); 

int threadCount = threadGroup.activeCount();

Thread threadList[] = new Thread[threadCount];

threadGroup.enumerate(threadList);

 

 

 

2.  Як отримати список мертвих ниток із групи ThreadGroup?

Такий список можна отримати, якщо попередньо всі активні потоки з ThreadGroup додати в масив (п.1). Для відстеження terminated стану:

 public static List<Thread> getTerminatedThreads(Thread[] threads) {

        List<Thread> result = new ArrayList<>();

        for ( Thread thread : allThreads )

            if ( thread.getState( ) == Thread.State.TERMINATED)

                result.add(thread);

        return result;

    }

 

3. Аналоги ThreadPoolExecutor?

FixedThreadPool – пул, що містить фіксовану кількість ниток (к-сть ниток вказуємо при створенні пула). Якщо виникає виняток і нитка завершує роботу, створюється нова нитка.

ExecutorService executorService = Executors.newFixedThreadPool(5);

CashedThreadPool  - пул, що створює нові нитки, коли це потрібно. Якщо для відправленої задачі не доступна жодна нитка, буде створено нову нитку.

ExecutorService executorService = Executors.newCachedThreadPool();

ScheduledThreadPool - дозволяє запускати завдання після виникнення затримки, а також із деякою періодичністю, що дозволяє реалізувати на базі цього класу Timer Service.

ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);

SingleThreadExecutor – пул складається з однієї нитки, яка виконує задачі послідовно. Якщо виникає виняток, створюється нова нитка.

ExecutorService executorService = Executors.newSingleThreadExecutor();

 

4.  Що таке ThreadWorker?

Кожен новий фоновий процес вимагає створення двох нових класів: BatchJob і ThreadWorker. Ці класи відповідають паттерну «master-worker», який використовується інфраструктурою виконання фонового процесу для подолання обмежень пропускної здатності, з якими стикаються однопотокові процеси. Розподіляючи роботу між багатьма одночасними потоками, часто на кількох фізичних вузлах, фонові процеси можуть досягти чудової масштабованості та реагувати на зміну робочих вимог без додаткового програмування. У цьому шаблоні:

BatchJob відповідає за визначення роботи, яка буде оброблена для пакетного виконання, а потім розділення цієї роботи на частини, які оброблятиме кожен ThreadWorker. Під час запуску одного процесу фреймворком створюється один об’єкт BatchJob. Потім структура здійснює виклики екземпляра BatchJob у відповідний час. Одним із таких наборів викликів екземпляра BatchJob є повернення до інфраструктури колекції екземплярів ThreadWork, які будуть розповсюджені для виконання.

(?) ThreadWorker відповідає за обробку кожного екземпляра ThreadWork, запущеного на виконання. У ThreadWork є багато робочих одиниць, що представляють дрібні одиниці роботи, які потрібно обробити. У багатьох випадках WorkUnits представляють повну транзакцію бази даних, наприклад, рахунок, що створюється для облікового запису. Чи виконується ThreadWorker на тому самому комп’ютері, що й інші ThreadWorker, або BatchJob, який створив його роботу, залишається як вибір конфігурації, який потрібно зробити під час виконання. В одному процесі може бути багато об’єктів ThreadWorker. Загалом, кожен ThreadWorker, створений у пакетному виконанні, має відповідний рядок у таблиці Batch Instance. Рядки Batch Instance забезпечують постійний стан, необхідний для правильної роботи ThreadWorkers у ситуаціях збою/перезапуску.

 

 

5.          Що таке ThreadPool?

Thread Pool – паттерн, допомагає економити ресурси в багатопотоковій програмі та утримувати паралелізм у певних попередньо визначених межах шляхом повторного використання існуючих потоків.

Паттерн дозволяє нам контролювати кількість потоків, які створює програма, і їхній життєвий цикл. Ми також можемо планувати виконання завдань і зберігати вхідні завдання в черзі.

Java надає структуру Executor, яка зосереджена навколо інтерфейсу Executor, його підінтерфейсу –ExecutorService та класу-ThreadPoolExecutor, який реалізує обидва ці інтерфейси. Використовуючи Executor, потрібно лише реалізувати об’єкти Runnable і надіслати їх Executor-у для виконання.

Вони дозволяють скористатися перевагами потоків і зосередитися на завданнях, які ви хочете виконувати у потоці, а не на механізмі потоку.

Щоб використовувати пули потоків, ми спочатку створюємо об’єкт ExecutorService і передаємо йому набір завдань. Клас ThreadPoolExecutor дозволяє встановити ядро ​​та максимальний розмір пулу. Виконувані елементи, які запускаються певним потоком, виконуються послідовно.

 

 

Коментарі

Популярні дописи з цього блогу

27 Гугл 1 goto. Зарезервовані (ключові) слова. wait не в блоці synchronized. happens-before. BlockingQueue. Методи BlockingQueue

28. Соб 1. Какие приоритеты нитей бывают? Можно ли остановить нить, снизив ее приоритет до 0? Зачем нужен класс ThreadGroup? В какой группе нитей состоит main-thread? Что такое паттерн ThreadPool?

27. Соб.2 Что происходит после вызова метода notifyAll? Какие выгоды получает объект, если он immutable? Что такое «thread-safe»? Что такое «happens-before»? Что такое JMM? Какое исключение вылетит, если вызвать wait не в блоке synchronized?