Создание потоков с помощью java.util.concurrent.ThreadFactory

Шаблон проектирования фабрики является одним из наиболее используемых шаблонов проектирования в Java. Это один из шаблонов создания, который может быть использован для разработки объекта, востребованного одним или несколькими классами. С помощью этой фабрики мы централизуем создание объектов.

Централизация логики создания дает нам некоторые преимущества, например:

  1. Легко изменить класс создаваемых объектов или способ их создания.
  2. Легко ограничить создание объектов для ограниченных ресурсов. Например, мы можем иметь только N объектов одного типа.
  3. Легко генерировать статистические данные о создании объектов.

В Java мы обычно создаем потоки двумя способами, а именно , расширяя класс потока и реализуя runnable интерфейс. Java также предоставляет интерфейс ThreadFactory для создания собственной фабрики объектов Thread.

Различные классы, такие как ThreadPoolExecutor, используют конструкторы, которые принимают ThreadFactory в качестве аргумента. Эта фабрика используется, когда исполнитель создает новый поток. Используя ThreadFactory, вы можете настроить потоки, созданные исполнителем, чтобы они имели правильные имена потоков, приоритет или даже могли быть установлены как демоны.

Пример ThreadFactory

В этом примере мы узнаем, как реализовать интерфейс ThreadFactory для создания объектов Thread с персонализированным именем, а также как сохранять статистику созданных объектов Thread.

Задача.java

class Task implements Runnable{@Overridepublic void run(){try{TimeUnit.SECONDS.sleep(2);} catch(InterruptedException e){e.printStackTrace();}}}

CustomThreadFactory.java

public class CustomThreadFactory implements ThreadFactory{private int counter;private String name;private List<String> stats;public CustomThreadFactory(String name){counter = 1;this.name = name;stats = new ArrayList<String>();}@Overridepublic Thread newThread(Runnable runnable){Thread t = new Thread(runnable, name + "-Thread_" + counter);counter++;stats.add(String.format("Created thread %d with name %s on %s \n", t.getId(), t.getName(), new Date()));return t;}public String getStats(){StringBuffer buffer = new StringBuffer();Iterator<String> it = stats.iterator();while(it.hasNext()){buffer.append(it.next());}return buffer.toString();}}

Чтобы использовать вышеуказанную фабрику потоков, смотрите пример ниже:

public static void main(String[] args){CustomThreadFactory factory = new CustomThreadFactory("CustomThreadFactory");Task task = new Task();Thread thread;System.out.printf("Starting the Threads\n\n");for(int i = 1; i <= 10; i++){thread = factory.newThread(task);thread.start();}System.out.printf("All Threads are created now\n\n");System.out.printf("Give me CustomThreadFactory stats:\n\n" + factory.getStats());}Output :Starting the ThreadsAll Threads are created nowGive me CustomThreadFactory stats:Created thread 9 with name CustomThreadFactory-Thread_1 on Tue Jan 06 13:18:04 IST 2015Created thread 10 with name CustomThreadFactory-Thread_2 on Tue Jan 06 13:18:04 IST 2015Created thread 11 with name CustomThreadFactory-Thread_3 on Tue Jan 06 13:18:04 IST 2015Created thread 12 with name CustomThreadFactory-Thread_4 on Tue Jan 06 13:18:04 IST 2015Created thread 13 with name CustomThreadFactory-Thread_5 on Tue Jan 06 13:18:04 IST 2015Created thread 14 with name CustomThreadFactory-Thread_6 on Tue Jan 06 13:18:04 IST 2015Created thread 15 with name CustomThreadFactory-Thread_7 on Tue Jan 06 13:18:04 IST 2015Created thread 16 with name CustomThreadFactory-Thread_8 on Tue Jan 06 13:18:04 IST 2015Created thread 17 with name CustomThreadFactory-Thread_9 on Tue Jan 06 13:18:04 IST 2015Created thread 18 with name CustomThreadFactory-Thread_10 on Tue Jan 06 13:18:04 IST 2015

Здесь интерфейс ThreadFactory имеет только один метод, называемый newThread(). Он получает объект Runnable в качестве параметра и возвращает объект Thread. При реализации интерфейса ThreadFactory вам необходимо реализовать этот интерфейс и переопределить этот метод.

Прокрутить вверх