Java 多线程 - 线程 - 工厂类创建线程

本文介绍了工厂模式的概念及其在Java中的应用实例。通过实现ThreadFactory接口来自定义线程工厂,详细展示了如何创建并管理线程,同时记录线程创建过程中的统计信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

工厂模式是面向对象编程中最常使用的模式之一,它是个创建者模式,使用一个类为其他的一个或者多个类创建对象。当我们要为这些类创建对象时,不需再使用 new 构造器,而是使用工厂类。

好处:

1、更容易修改类,或者改变创建对象的方式。

2、更容易为有限资源限制创建对象的数目。如:可以限制一个类型的对象不多于 n 个。

3、更容易为创建的对象生成统计数据。

二、实现  

实现 ThreadFactory 接口 :

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ThreadFactory;

/**
 * 实现 ThreadFactory 接口 来 自定义  创建线程的工程类
 */
public class MyThreadFactory implements ThreadFactory{

	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
	private int counter;
	private String name;
	private List<String> stas; // 存放线程对象的 统计性数字
	
	public MyThreadFactory(String name) {
		counter = 0;
		this.name = name;
		stas = new ArrayList<String>();
	}
	
	@Override
	public Thread newThread(Runnable r) {
		Thread thread = new Thread(r, name+"-thread-"+counter);
		counter++;
		stas.add("线程:id-"+thread.getId()+",name:" + thread.getName() + "," + sdf.format(new Date()) + "被创建...");
		return thread;
	}
	
	//表示所有的数据
	public void getStas(){
		if(stas == null || stas.size() == 0){
			System.out.println("未进行线程创建操作..");
			return;
		}
		for(String s : stas){
			System.out.println(s);
		}
	}
}
import java.util.concurrent.TimeUnit;

public class PrintTask implements Runnable{

	public void run() {
	    try {
	    	System.out.println(Thread.currentThread().getName() +"- 任务 test");
			TimeUnit.SECONDS.sleep(1);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}
public class MyThreadFactoryTest {

	public static void main(String[] args) {
		PrintTask printTask = new PrintTask();
		MyThreadFactory myThreadFactory = new MyThreadFactory("myThreadFactory");
	    for(int i=0;i<3;i++){
	    	Thread thread = myThreadFactory.newThread(printTask);
	    	thread.start();
	    	try {
				thread.join(); // 主线程 等待 子线程完成后继续.
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
	    }	    
	    myThreadFactory.getStas();
	    System.out.println(Thread.currentThread().getName() + " -> 结束..");
	}
	
}
//console 结果:
myThreadFactory-thread-0- 任务 test
myThreadFactory-thread-1- 任务 test
myThreadFactory-thread-2- 任务 test
线程:id-11,name:myThreadFactory-thread-0,2017-09-07 09:40:20被创建...
线程:id-12,name:myThreadFactory-thread-1,2017-09-07 09:40:21被创建...
线程:id-13,name:myThreadFactory-thread-2,2017-09-07 09:40:22被创建...
main -> 结束..

 

转载于:https://my.oschina.net/u/1387400/blog/1531026

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值