使用工厂类创建线程

  工厂模式是面向对象编程中最常使用的模式之一。它是一个创建者模式,使用一个类为其他的一个或者多个类创建对象。当我们要为这些类创建对象时,不需再使用new构造器,而使用工厂类。

  使用工厂类,可以将对象的创建集中化,这样做有以下的好处:

  • 更容易修改类,或者改变创建对象的方式;
  • 更容易为有限资源限制创建对象的数目。例如,我们可以限制一个类型的对象不多于n个。
  • 更容易为创建的对象生成统计数据。

  Java提供了ThreadFactory接口,这个接口实现了线程对象工厂。Java并发API的高级工具类也使用了线程工厂创建线程。

  下面我们学习如何通过实现ThreadFactory接口来创建线程对象,用以生成个性化名称的线程并且保存这些线程对象的统计信息。

1. 创建名称为MyThreadFactory的类,并且实现ThreadFactory接口。

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ThreadFactory;

public class MyThreadFactory implements ThreadFactory {
    private int counter; //存储线程对象的数量
    private String name; //存放工厂的名字
    private List<String> stats; //存放线程对象的统计数据
    public MyThreadFactory(String name){
        counter = 0;
        this.name = name;
        stats = new ArrayList<String>();
    }
    @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;
    }

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

2. 创建名为Task的类并且实现Runnable接口。

import java.util.concurrent.TimeUnit;


public class Task implements Runnable {
    //仅仅是让线程休眠1秒
    @Override
    public void run() {
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

3. 创建主类Main

public class Main {

    public static void main(String[] args) {
        MyThreadFactory factory = new MyThreadFactory("MyThreadFactory");
        Task task = new Task();
        Thread t;
        System.out.println("Starting the Threads");
        //使用工厂类创建10个线程对象
        for(int i=0;i<10;i++){
            t = factory.newThread(task);
            t.start();
        }
        System.out.println("Factory stats:");
        System.out.println(factory.getStats());
    }
}

 

posted @ 2015-10-24 13:09  ~风轻云淡~  阅读(1342)  评论(0编辑  收藏  举报