线程管理(十二)用线程工厂创建线程

简介:

用线程工厂创建线程

在面向对象编程的世界中,工厂模式是最有用的设计模式。它是一个创造模式,还有它的目的是创建一个或几个类的对象的对象。然后,当我们想创建这些类的对象时,我们使用工厂来代替new操作。

有了这个工厂,我们有这些优势来集中创建对象们:

  • 更简单的改变了类的对象创建或者说创建这些对象的方式。
  • 更简单的为了限制的资源限制了对象的创建。 例如, 我们只new一个此类型的对象。
  • 更简单的生成创建对象的统计数据。

Java提供一个接口, ThreadFactory 接口实现一个线程对象工厂。 并发 API 使用线程工厂来创建线程的一些基本优势。

在这个指南中,我们将学习如何实现ThreadFactory 接口来创建Thread 对象,当我们储存创建的线程对象时,可以取个性化的名字。

准备
指南中的例子是使用Eclipse IDE 来实现的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 打开并创建一个新的java项目。

怎么做呢
按照这些步骤来实现下面的例子:

1.   创建一个类名为 MyThreadFactory 一定实现 ThreadFactory 接口。


1 public class MyThreadFactory implements ThreadFactory {

2.   声明属性们:counter,整数,用来储存线程对象的数量;name,字符串,每个创建线程的名字;stats, 字符串list, 储存创建的线程对象的统计数据。我们也要实现类的构造函数并初始化。


1 private int counter;
2 private String name;
3 private List<String> stats;
4 public MyThreadFactory(String name){
5 counter=0;
6 this.name=name;
7 stats=new ArrayList<String>();
8 }

3.   实现 newThread() 方法. 此方法 会接收Runnable接口并返回一个 Thread 对象给这个 Runnable 接口。 在这里, 我们生成线程对象的名字,然后创建新的线程对象,最后保存统计数据。


1 @Override
2 public Thread newThread(Runnable r) {
3 Thread t=new Thread(r,name+"-Thread_"+counter);
4 counter++;
5 stats.add(String.format("created thread %d with name %s on %s\n",t.getId(),t.getName(),new Date()));
6  
7 return t;
8 }

4.   实现 getStatistics()方法 ,返回 String 对象, 全部的创建的 Thread 对象的统计数据。


1 public String getStats(){
2 StringBuffer buffer=new StringBuffer();
3 Iterator<String> it=stats.iterator();
4 while (it.hasNext()) {
5 buffer.append(it.next());
6 buffer.append("\n");
7 }
8 return buffer.toString();
9 }

5.   创建一个类名为 Task 一定实现 Runnable接口. 对于这个例子,这些任务什么都不做只是休眠一秒。


1 public class Task implements Runnable {
2 @Override
3 public void run() {
4 try { TimeUnit.SECONDS.sleep(1);
5 } catch (InterruptedException e) {
6 e.printStackTrace();
7 }
8 }
9 }

6.   创建主类. 创建一个类名为 Main 并实现main() 方法.


1 public class Main {
2 public static void main(String[] args) {

7.   创建 MyThreadFactory 对象和 Task 对象。


1 MyThreadFactory factory=new MyThreadFactory("MyThreadFactory");
2 Task task=new Task();

8.   使用 MyThreadFactory 对象创建 10 Thread 对象并开始它们.


1 Thread thread;
2 System.out.printf("Starting the Threads\n");
3 for (int i=0; i<10; i++){
4 thread=factory.newThread(task);
5 thread.start();
6 }

9.   把线程厂的数据写入控制台。


1 System.out.printf("Factory stats:\n"); System.out.printf("%s\n",factory.getStats());

10. 运行例子并查看结果。

它是怎么工作的

ThreadFactory 接口只有一个方法是 newThread。它接收 Runnable 对象作为参数并返回一个 Thread 对象。当你实现一个 ThreadFactory 接口,你必须实现此接口并覆盖这个方法。最基本的 ThreadFactory只有一行。


1 return new Thread(r);

你可以加一些变量来提升这个实现:

  • 在这个例子中创建自定义线程,名字使用特别形式或者继承Java Thread类来创建自己的Thread类。
  • 保存线程创建数据,如之前的例子。
  • 限制线程创建个数。
  • 验证线程的创建。
  • 和你能想到的任何东西。

使用工厂设计模式是很好的练习,但是,如果你实现一个 ThreadFactory 接口来集中创建线程,那么你必须再检查代码确保使用的线程都是用这个工厂创建的。

参见

  • 第七章: 发类的定制实现ThreadFactory接口来生成自定义线程
  • 第七章: 并发类的定制在执行者对象中使用我们的 ThreadFactory
目录
相关文章
|
1月前
|
Java Linux API
【并发编程】Java线程,如何创建线程
【并发编程】Java线程,如何创建线程
|
2月前
|
存储 开发框架 安全
【C++ 线程】深入理解C++线程管理:从对象生命周期到线程安全
【C++ 线程】深入理解C++线程管理:从对象生命周期到线程安全
94 0
|
8月前
|
Java
Java线程池-线程工厂ThreadFactory
我们在项目开发额过程中,如果有很多地方使用多线程,那么给线程命名是十分有必要的,这样当出现问题的时候就比较容易排查
65 0
|
12月前
|
Java
Java线程基本概念以及创建线程的几种方式
Java线程基本概念以及创建线程的几种方式
|
Java 调度
【Java|多线程与高并发】 使用Thread 类创建线程的5种方法&&如何查看程序中的线程
多线程编程主要是为了更好地解决并发编程这个问题,因为创建销毁调度一个进程开销比较大(消耗资源多和速度慢),进程之所以开销比较大,主要是在"资源的分配和回收上"而线程也被称为"轻量级进程",因此在解决并发编程这个问题上,线程的创建销毁调度的更快一些.
|
Java 程序员
线程 --- 创建线程的七种方法
线程 --- 创建线程的七种方法
88 0
java对线程之创建线程
直接使用Thread、方法二:使用Runnable结合Thread、方法三:FutureTask 配合 Thread
|
监控 Java
Java利用线程工厂监控线程池
Java利用线程工厂监控线程池
|
监控 并行计算 Java
《JUC并发编程 - 高级篇》01 - 进程与线程概述 | 02 - Java线程(创建线程、查看线程、线程常见方法、线程状态)(四)
《JUC并发编程 - 高级篇》01 - 进程与线程概述 | 02 - Java线程(创建线程、查看线程、线程常见方法、线程状态)
《JUC并发编程 - 高级篇》01 - 进程与线程概述 | 02 - Java线程(创建线程、查看线程、线程常见方法、线程状态)(四)