文档章节

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

pan_1308
 pan_1308
发布于 2017/09/07 09:42
字数 453
阅读 34
收藏 2

一、概述

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

没有更多内容

加载失败,请刷新页面

加载更多

ehlib 修改 使行号字体颜色 与标题字体颜色 一致

对ehlib 显示效果不够满意,而做的调整 修改这个过程:procedure TCustomDBGridEh.DrawIndicatorCell(ACol, ARow: Longint; AreaCol, AreaRow: Longint; ARect: TRect; AState: TGri......

vga
39分钟前
0
0
Bash重定向详解

Bash重定向详解 Bash的重定向指的是将命令的输入和输出导向不同地方,而不是默认的标准输入、标准输出和标准错误。Bash的重定向实际上是对标准输入、标准输出和标准错误的重置,进而将所需输...

小陶小陶
今天
3
0
EventBus原理深度解析

一、问题描述 在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个jvm里面通知的话,就可以使用EventBus。由于Event...

yangjianzhou
今天
23
0
OpenCV图像处理实例:libuv+cvui显示摄像头视频

#include <iostream>#include <opencv2/opencv.hpp>#define CVUI_IMPLEMENTATION#include <cvui.h>extern "C"{#include <uv.h>}using namespace std;#define WINDOW_NAM......

IOTService
今天
4
0
openJDK之JDK9的String

1.openJDK8的String 先来看下openJDK8的String的底层,如下图1.1所示: 图1.1 底层上使用的是char[],即char数组 每个char占16个bit,Character.SIZE的值是16。 2.openJDK9中的String 图2.1...

克虏伯
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部