• 使用工厂类创建线程


      工厂模式是面向对象编程中最常使用的模式之一。它是一个创建者模式,使用一个类为其他的一个或者多个类创建对象。当我们要为这些类创建对象时,不需再使用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
    ", 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("
    ");
            }
            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());
        }
    }
  • 相关阅读:
    Linux strace命令
    Xilinx实习一年总结
    Red Hat Linux 挂载外部资源
    4.6、Libgdx线程介绍
    Xshell中文乱码怎么处理?
    C++之指针指向二维数组
    POJ 2996 Help Me with the Game
    UVa 10377
    你们都满足下面的工作考核吗
    使用Python编写简单网络爬虫抓取视频下载资源
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4906650.html
Copyright © 2020-2023  润新知