Java并发编程实例--12.使用线程工厂创建线程

工厂模式是面向对象编程世界中最有用的设计模式。

它是一个创新型的模式,目标是开发一个对象,这个对象的任务是去创建其他类对象。

这样一来,如果我们想创建某些类的对象就不需要使用new关键字。好处有以下几点:


1.容易改变对象的类或者创建这些对象的方式;

2.容易限制所创建的对象。例如,我们只能创建N个某类型的对象;

3.容易生成对象创建的统计数据;


Java并发API提供了ThreadFactory接口以实现一个线程对象工厂。一些并发API高级工具都使用线程工厂去创建线程。



本例中,我们将学习如何去实现ThreadFactory接口去创建线程对象。


MyThreadFactory.java

package com.dylan.thread.ch1.c12.factory;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ThreadFactory;

/**
 * Class that implements the ThreadFactory interface to
 * create a basic thread factory
 *
 */
public class MyThreadFactory implements ThreadFactory {

	// Attributes to save the necessary data to the factory
	private int counter;
	private String name;
	private List<String> stats;
	
	/**
	 * Constructor of the class
	 * @param name Base name of the Thread objects created by this Factory
	 */
	public MyThreadFactory(String name){
		counter=0;
		this.name=name;
		stats=new ArrayList<String>();
	}
	
	/**
	 * Method that creates a new Thread object using a Runnable object
	 * @param r: Runnable object to create the new Thread
	 */
	@Override
	public Thread newThread(Runnable r) {
		// Create the new Thread object
		Thread t=new Thread(r,name+"-Thread_"+counter);
		counter++;
		// Actualize the statistics of the factory
		stats.add(String.format("Created thread %d with name %s on %s\n",t.getId(),t.getName(),new Date()));
		return t;
	}
	
	/**
	 * Method that returns the statistics of the ThreadFactory 
	 * @return The statistics of the ThreadFactory
	 */
	public String getStats(){
		StringBuffer buffer=new StringBuffer();
		Iterator<String> it=stats.iterator();
		
		while (it.hasNext()) {
			buffer.append(it.next());
		}
		
		return buffer.toString();
	}

}


Task.java

package com.dylan.thread.ch1.c12.task;

import java.util.concurrent.TimeUnit;

public class Task implements Runnable {

	@Override
	public void run() {
		try {
			TimeUnit.SECONDS.sleep(1);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}

Main.java

package com.dylan.thread.ch1.c12.core;


import com.dylan.thread.ch1.c12.factory.MyThreadFactory;
import com.dylan.thread.ch1.c12.task.Task;

/**
 * Main class of the example. Creates a Thread factory and creates ten 
 * Thread objects using that Factory 
 *
 */
public class Main {

	/**
	 * Main method of the example. Creates a Thread factory and creates 
	 * ten Thread objects using that Factory
	 * @param args
	 */
	public static void main(String[] args) {
		// Creates the factory
		MyThreadFactory factory=new MyThreadFactory("MyThreadFactory");
		// Creates a task
		Task task=new Task();
		Thread thread;
		
		// Creates and starts ten Thread objects
		System.out.printf("Starting the Threads\n");
		for (int i=0; i<10; i++){
			thread=factory.newThread(task);
			thread.start();
		}
		// Prints the statistics of the ThreadFactory to the console
		System.out.printf("Factory stats:\n");
		System.out.printf("%s\n",factory.getStats());
		
	}

}

运行结果:

Starting the Threads
Factory stats:
Created thread 10 with name MyThreadFactory-Thread_0 on Sat May 05 16:34:56 CST 2018
Created thread 11 with name MyThreadFactory-Thread_1 on Sat May 05 16:34:56 CST 2018
Created thread 12 with name MyThreadFactory-Thread_2 on Sat May 05 16:34:56 CST 2018
Created thread 13 with name MyThreadFactory-Thread_3 on Sat May 05 16:34:56 CST 2018
Created thread 14 with name MyThreadFactory-Thread_4 on Sat May 05 16:34:56 CST 2018
Created thread 15 with name MyThreadFactory-Thread_5 on Sat May 05 16:34:56 CST 2018
Created thread 16 with name MyThreadFactory-Thread_6 on Sat May 05 16:34:56 CST 2018
Created thread 17 with name MyThreadFactory-Thread_7 on Sat May 05 16:34:56 CST 2018
Created thread 18 with name MyThreadFactory-Thread_8 on Sat May 05 16:34:56 CST 2018
Created thread 19 with name MyThreadFactory-Thread_9 on Sat May 05 16:34:56 CST 2018



猜你喜欢

转载自blog.csdn.net/indexman/article/details/80206988