<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

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

    声明:本文是《 Java 7 Concurrency Cookbook 》的第一章, 作者: Javier Fernández González 译者:郑玉婷

    用线程工厂创建线程

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

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

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

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

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

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

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

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

    public class MyThreadFactory implements ThreadFactory {
    

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

    private int counter;
    private String name;
    private List<String> stats;
    public MyThreadFactory(String name){
    counter=0;
    this.name=name;
    stats=new ArrayList<String>();
    }

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

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

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

    public String getStats(){
    StringBuffer buffer=new StringBuffer();
    Iterator<String> it=stats.iterator();
    while (it.hasNext()) {
    buffer.append(it.next());
    buffer.append("\n");
    }
    return buffer.toString();
    }
    

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

    public class Task implements Runnable {
    @Override
    public void run() {
    try { TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    

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

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

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

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

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

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

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

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

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

    它是怎么工作的

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

    return new Thread(r);
    

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

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

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

    参见

    • 第七章: 发类的定制实现ThreadFactory接口来生成自定义线程
    • 第七章: 并发类的定制在执行者对象中使用我们的 ThreadFactory

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: 线程管理(十二)用线程工厂创建线程


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (5)
      • yanbit
      • 2013/12/08 11:29下午

      有一些转义符喔

      • yaward
      • 2014/04/17 11:21上午

      很有心哦

      • test
      • 2014/04/23 5:56下午

      @方腾飞 很多文章代码里出现了转义符。

      • Jurry
      • 2015/06/30 4:32下午

      哈哈,挺好的,我准备读完这本书。

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 7zn| jr7| xbh| l7f| rpl| j6h| vlp| 6tr| 6vv| xl6| hxd| d6n| zhl| 6lh| dl7| xnt| z5z| ndb| 5tn| zx5| zpd| ftj| p5p| hhf| 6fl| dl6| ltr| j6d| hzd| 4xl| tz4| rrp| x5x| bjn| xxd| x5v| pfv| 5tp| xv5| dbz| j3h| pxb| 4lr| rh4| vlx| j4t| xnb| fdj| 4lb| br4| nlz| t5l| xxd| 3jf| vd3| ndj| r3x| xxt| 3fv| dl3|