文档章节

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

pan_1308
 pan_1308
发布于 2017/09/07 09:42
字数 453
阅读 33
收藏 2
点赞 0
评论 0

一、概述

工厂模式是面向对象编程中最常使用的模式之一,它是个创建者模式,使用一个类为其他的一个或者多个类创建对象。当我们要为这些类创建对象时,不需再使用 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 -> 结束..

 

© 著作权归作者所有

共有 人打赏支持
pan_1308
粉丝 4
博文 94
码字总数 58819
作品 0
黄冈
Java多线程(全)学习笔记(下)

七.Callable和Future接口 C#可以把任意方法包装成线程执行体,包括那些有返回值的方法。Java也从jdk1.5开始,加入了Callable接口用来扩展Runnable接口的功能,Callable接口提供一个call()...

明舞
2014/07/27
0
0
-1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方...

noteless
07/03
0
0
深入研究java.lang.ThreadLocal类

一、概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局...

FoxHu
2012/05/08
0
0
ThreadLocal 基础知识

ThreadLocal是什么 · 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ...

向阳而生
2015/11/21
0
0
Java多线程之线程池(ThreadPoolExecutor)实现原理分析(一)

在上一篇文章Java中实现多线程的3种方法介绍和比较中,我们讲解了Java中实现多线程的3种方法。使用多线程,就必须要考虑使用线程池,今天我们来聊聊线程池的那些事。 注:源码都是基于JDK1....

小怪聊职场
05/14
0
0
Java高级-解析Java中的多线程机制

一、进程与应用程序的区别 进程(Process)是最初定义在Unix等多用户、多任务操作系统环境下用于表示应用程序在内存环境中基本执行单元的概念。以Unix操作系统为例,进程是Unix操作系统环境中...

陶邦仁
2012/11/11
0
0
java基础专栏—Thread

进程概述 正在运行的程序就是进程 单线程不会出现安全问题,但是效率堪忧 分时调度:每个线程平均占用CPU 抢占调度:优先级不同的线程可以 Thread子类实现线程 继承至Thread类,并重写Threa...

T-newcomer
2017/10/21
0
0
并行设计模式--Thread Specific Storge模式

多线程的不安全在于共享了变量实例,因此模式的思路是把变量与单一线程绑定,那么就不存在共享,自然就避免了加锁消耗以及其他高并发所需要的策略。 一般有两种策略:1. ThreadLocal策略,也...

java高级架构牛人
05/21
0
0
【转】Java线程面试题Top50

目录(?)[-] 50道Java线程面试题 1 什么是线程 2 线程和进程有什么区别 3 如何在Java中实现线程 4 用Runnable还是Thread 6 Thread 类中的start 和 run 方法有什么区别 7 Java中Runnable和Cal...

gehui
2015/08/14
0
0
InheritableThreadLocal详解

1、简介 在上一篇 ThreadLocal详解 中,我们详细介绍了ThreadLocal原理及设计,从源码层面上分析了ThreadLocal。但由于ThreadLocal设计之初就是为了绑定当前线程,如果希望当前线程的ThreadL...

沈渊
04/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

崛起于Springboot2.X之thymeleaf(24)

1、依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency> 2、application.properties spring......

木九天
1分钟前
0
0
spring-boot:run启动时,指定spring.profiles.active

Maven启动指定Profile通过-P,如mvn spring-boot:run -Ptest,但这是Maven的Profile。 如果要指定spring-boot的spring.profiles.active,则必须使用mvn spring-boot:run -Drun.profiles=test......

夜黑人模糊灬
2分钟前
0
0
大数据分析挖掘技术学习:Python文本分类

引言 文本分类作为自然语言处理任务之一,被广泛应用于解决各种商业领域的问题。文本分类的目的是将 文本/文档 自动地归类为一种或多种预定义的类别。常见的文本分类应用如下: • 理解社交媒...

加米谷大数据
7分钟前
0
0
istio-0.8 指标监控,prometheus,grafana

配置: https://istio.io/docs/tasks/telemetry/metrics-logs/ https://istio.io/docs/tasks/telemetry/tcp-metrics/ envoy拦截请求>上报mixer>对接prometheus>grafana 效果截图: promethe......

xiaomin0322
9分钟前
0
0
公众号推荐

阿里技术 书籍:《不止代码》

courtzjl
12分钟前
0
0
关于改进工作效率

1.给不同的业务线建立需求群,所有的数据需求都在群里面提。 2.对于特别难搞定的事情,到对应的技术哪去做,有问题随时沟通。 3.定期给工作总结形成方法论。 4.学习新的技术,尝试用新的方法...

Avner
19分钟前
0
0
关于thinkphp 框架开启路径重写,无法获取Authorization Header

今天遇到在thinkphp框架中获取不到header头里边的 Authorization ,后来在.htaccess里面加多一项解决,记录下: <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews Rewrite......

殘留回憶
22分钟前
0
0
centos 使用yum安装nginx后如何添加模块 10

centos 使用yum安装nginx后如何添加模块 10 centos6.2版本,使用yum来安装了nginx,但是最近需要重新添加模块,所以就傻了,询问下有人知道怎么重新添加模块吗? PS:俺是新手,需要高手救助...

linjin200
25分钟前
0
0
dubbo 资料

dubbo资料网站: https://www.cnblogs.com/a8457013/p/7818925.html

zaolonglei
26分钟前
0
0
大型网站,你是如何架构的?

大型网站,你是如何架构的?

微小宝
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部