Use the java. util. concurrent. ThreadFactory class to create a thread
The factory design pattern is one of the most common design patterns in Java. It is a creation-type design pattern that can be used to create the objects required by one or more classes. With this factory, we can create objects in a centralized manner.
The centralized creation method brings us some benefits, such:
1. It is easy to change the object created by the class or the method of creating the object;
2. It is easy to restrict the creation of objects. For example, we can only create N objects for Class;
3. It is easy to generate statistics on Object creation.
In Java, we usually use two methods to create a Thread: Inherit the Thread class and implement the Runnable interface. Java also provides an interface, ThreadFactory interface, used to create your own thread object factory.
Many classes, such as ThreadPoolExecutor, use constructors to receive ThreadFactory as parameters. This factory parameter will create a new thread during program execution. With ThreadFactory, you can customize how the execution program creates a thread, such as defining a proper name and priority for the thread, or you can even set it as a daemon thread.
ThreadFactory example
In this example, we will learn how to create a thread object with a personalized name by implementing a ThreadFactory interface. At the same time, we save the creation Information of the thread object.
Task. java
class Task implements Runnable{ @Override public 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
stats; public CustomThreadFactory(String name) { counter = 1; this.name = name; stats = new ArrayList
(); } @Override public 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 , t.getId(), t.getName(), new Date())); return t; } public String getStats() { StringBuffer buffer = new StringBuffer(); Iterator
it = stats.iterator(); while (it.hasNext()) { buffer.append(it.next()); } return buffer.toString(); }}
To use the preceding thread factory, see the following execution program:
public static void main(String[] args){ CustomThreadFactory factory = new CustomThreadFactory(CustomThreadFactory); Task task = new Task(); Thread thread; System.out.printf(Starting the Threads); for (int i = 1; i <= 10; i++) { thread = factory.newThread(task); thread.start(); } System.out.printf(All Threads are created now); System.out.printf(Give me CustomThreadFactory stats: + factory.getStats());}
Program Execution result:
Output : Starting the Threads All Threads are created now Give 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
In the code above, the ThreadFactory interface has only one method called newThread (). It receives a Runnable object as a parameter and returns a Thread object. When you implement the ThreadFactory interface, you must override this method.
Happy Learning !!