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

用线程工厂创建线程

在面向对象编程的世界中,工厂模式是最有用的设计模式。它是一个创造模式,还有它的目的是创建一个或几个类的对象的对象。然后,当我们想创建这些类的对象时,我们使用工厂来代替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
时间: 2024-11-02 03:47:24

线程管理(十二)用线程工厂创建线程的相关文章

线程管理(二)获取和设置线程信息

获取和设置线程信息 Thread类的对象中保存了一些属性信息能够帮助我们来辨别每一个线程,知道它的状态,调整控制其优先级. 这些属性是: ID: 每个线程的独特标识. Name: 线程的名称. Priority: 线程对象的优先级.优先级别在1-10之间,1是最低级,10是最高级.不建议改变它们的优先级,但是你想的话也是可以的. Status: 线程的状态.在Java中,线程只能有这6种中的一种状态: new, runnable, blocked, waiting, time waiting,

深入Java线程管理(二):线程的生命周期

Java线程的生命周期 一个线程的产生是从我们调用了start方法开始进入Runnable状态,即可以被调度运行状态,并没有真正开始运行,调度器可以将CPU分配给它,使线程进入Running状态,真正运行其中的程序代码.线程在运行过程中,有以下几个可能的去向: (1)调度器在某个线程的执行过程中将CPU分配给了其它线程,则这个线程又变为Runnable状态,等待被调度. (2)调度器将CPU分配给了该线程,执行过程中没有遇到任何阻隔,运行完成直接结束,也就是run()方法执行完毕. (3)线程在

WCF技术剖析之三十二:一步步创建一个完整的分布式事务应用

在完成了对于WCF事务编程(<上篇>.<中篇>.<下篇>)的介绍后,本篇文章将提供一个完整的分布式事务的WCF服务应用,通过本例,读者不仅仅会了解到如何编程实现事务型服务,还会获得其他相关的知识,比如DTC和AS-AT的配置等.本例还是沿用贯通本章的应用场景:银行转帐.我们将会创建一个BankingService服务,并将其中的转帐操作定义成事务型操作.我们先从物理部署的角度来了解一下BankingService服务,以及需要实现怎样的分布式事务. 一.从部署的角度看分

windows server 2008 R2/windows 7管理十二 只读域控及DNS

关于只读域控,在各种官方和非官方的介绍中都已经铺天盖地了,我就不解释了,我描述下作用好了:只读域控一般用于服务器环境不是很安全的远程分支机构,分支机构从只读域控获取域登陆信息以及验证信息.因为是只读的,即使损坏也与总部域控影响不大.只读dns从网域主dns获取dns区域和记录,以提供给分公司登陆域使用. 本系列的拓扑中增加一台NS2安装2008R2并加入网域,本篇将其升级为只读域控和只读dns. 本篇分为1安装只读域控和只读dns2验证只读域控和只读dns 1.安装只读域控和只读dns NS2系

线程管理(一)线程的创建和运行

线程的创建和运行 在这个指南中,我们将学习如何在Java程序中创建和运行线程.与每个Java语言中的元素一样,线程是对象.在Java中,我们有2个方式创建线程: 通过直接继承thread类,然后覆盖run()方法. 构建一个实现Runnable接口的类, 然后创建一个thread类对象并传递Runnable对象作为构造参数 在这个指南中,我们将使用第二种方法来制作一个简单的程序,它能创建和运行10个线程.每一个线程能计算和输出1-10以内的乘法表. 准备 指南中的例子是使用Eclipse IDE

《Java程序员面试秘笈》—— 1.13 使用工厂类创建线程

1.13 使用工厂类创建线程 工厂模式是面向对象编程中最常使用的模式之一.它是一个创建者模式,使用一个类为其他的一个或者多个类创建对象.当我们要为这些类创建对象时,不需再使用new构造器,而使用工厂类. 使用工厂类,可以将对象的创建集中化,这样做有以下的好处: ◆ 更容易修改类,或者改变创建对象的方式: ◆ 更容易为有限资源限制创建对象的数目.例如,我们可以限制一个类型的对象不多于n个. ◆ 更容易为创建的对象生成统计数据. Java提供了ThreadFactory接口,这个接口实现了线程对象工

深入Java线程管理(一):线程的实现方式

Java的线程实现方式一共有三种,继承Thread.实现Runable接口,实现Callable接口.不过实现Runnable接口与实现Callable接口的方式基本相同,只是Callable接口里定义的方法有返回值,可以声明抛出异常而已. 一. 继承Thread类创建线程类 1) 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务. 2) 创建Thread子类的实例,即创建了线程对象. 3) 调用线程对象的start()方法来启动该线程.

如何创建线程

在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通使用的,需要在实践中不断积累.由于并发肯定涉及到多线程,因此在进入并发编程主题之前,我们先来了解一下进程和线程的由来,这对后面对并发编程的理解将会有很大的帮助. 下面是本文的目录大纲: 一.操作系统中为什么会出现进程? 二.为什么会出现线程? 三.多线程并发 若有不正之处,请多多谅解并欢迎指正. 请尊重作者劳动成果,转载请标明原文地址:

Java创建线程的两种方式_java

前言 多线程是我们开发过程中经常遇到的,也是必不可少需要掌握的.当我们知道需要进行多线程开发时首先需要知道的自然是如何实现多线程,也就是我们应该如何创建线程. 在Java中创建线程和创建普通的类的对象操作是一样的,我们可以通过两种方式来创建线程: 1.继承Thread类,并重写run()方法. 2.实现Runnable接口,并实现run()方法. 方法一:继承Thread类 代码非常简单 首先重载一个构造函数,以便我们可以给线程命名. 重写run()方法. 这里我们先让线程输出线程名+start