关于threadFactory理解和利用线程工厂监控线程

在面向对象编程的世界中,工厂模式是最有用的设计模式。它是一个创造模式,还有它的目的是创建一个或几个类的对象的对象。

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

  • 更简单的改变了类的对象创建或者说创建这些对象的方式。
  • 更简单的为了限制的资源限制了对象的创建。 例如, 我们只new一个此类型的对象。
  • 更简单的生成创建对象的统计数据。
Java提供一个接口, ThreadFactory 接口实现一个线程对象工厂。 并发 API 使用线程工厂来创建线程的一些基本优势。

以上是我看到的官方的说明,以下是我通俗的理解:

1.有了这个ThreadFactory接口,我们就可以自定义线程工厂接口。这个接口只需要实现一个方法就是newThread,这个方法必须返回一个线程。线程    工厂就是通过这个方法进行初始化线程的。

2.以下是我写的一个demo,就是自定义一个线程工厂,观察一下每个线程跟线程工厂关系。还有我在我的线程工厂里自定义了一个方法就是threadDaemon这个我起名叫线程守护,作用是在我的main方法里面写了一个定时线程池去调用这个方法,监控我的线程是否挂了。挂了我就启动一个新的线程。



public class ThreadFactoryTest implements ThreadFactory{

private List<Thread> threadList;

private Executor executor;


public ThreadFactoryTest() {
         threadList=new ArrayList<Thread>();
}
   private   int count=0;

//初始化线程工厂
    @Override
    public Thread newThread(Runnable runnable) {
        Thread result=new Thread(runnable);
        System.out.println("hello,我是"+count+++":"+Thread.currentThread().getName());
        threadList.add(result);
        return result;
}

public void threadDaemon(){
     List<Thread> deadThreads=new ArrayList<Thread>();
      for (Thread thread : threadList) {
         if(!thread.isAlive()){
          System.out.println(thread.getName());
          deadThreads.add(thread);
        }
      }
       threadList.removeAll(deadThreads);

     for (Thread thread : deadThreads) {
        if(!thread.isAlive()){
          executor.execute(new Go());
         }
       }
}

public List<Thread> getThreadList() {
    return threadList;
}
public void setThreadList(List<Thread> threadList) {
    this.threadList = threadList;
}
public Executor getExecutor() {
     return executor;
}
public void setExecutor(Executor executor) {
    this.executor = executor;
}




}

public class ThreadFactoryMain {


private static ThreadFactoryTest threadFactory=new ThreadFactoryTest();

public static void main(String[] args) {
     init();

}

private static void init(){

      ScheduledExecutorService service=Executors.newSingleThreadScheduledExecutor();

      Executor executor=Executors.newFixedThreadPool(10,threadFactory);

      threadFactory.setExecutor(executor);

      for (int i = 0; i < 10; i++) {
          executor.execute(new Go());
      }
     System.out.println(threadFactory.getThreadList().size());
	//启动定时任务监控线程
     service.scheduleAtFixedRate(new Runnable() {
                 @Override
              public void run() {
               threadDaemon();
                },5, 5, TimeUnit.SECONDS);

}

/**
 * 监控线程是不是挂了,挂了就起来
*/
   private static void threadDaemon(){
       System.out.println("定时任务开始");
       threadFactory.threadDaemon();
    }
 }




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值