代码改变世界

第一章:多线程九之ThreadFactory(线程工厂)

2023-10-23 17:15  阿方技术圈  阅读(686)  评论(0)    收藏  举报
     package java.util.concurrent;
     public interface ThreadFactory {
         //唯一的方法:创建一个新线程
         Thread newThread(Runnable target);
     }

  在调用ThreadFactory的唯一方法newThread()创建新线程时,可以更改所创建的新线程的名称、线程组、优先级、守护进程状态等。如果newThread()的返回值为null,表示线程工厂未能成功创建线程,线程池可能无法执行任何任务。使用Executors创建新的线程池时,也可以基于ThreadFactory(线程工厂)创建,在创建新线程池时可以指定将要使用的ThreadFactory实例。只不过,如果没有指定的话,就会使用Executors.defaultThreadFactory默认实例。使用默认的线程工厂实例所创建的线程全部位于同一个ThreadGroup(线程组)中,具有相同的NORM_PRIORITY(优先级为5),而且都是非守护进程状态。

 

代码示例

package com.heima.multiThread;

import org.junit.Test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;

public class CreateThreadPoolDemo {

    static public class SimpleThreadFactory implements ThreadFactory{

        static AtomicInteger threadNo = new AtomicInteger(1);

        public Thread newThread(Runnable targert) {

         String threadName = "simpleThread-" +  threadNo.get();
         System.out.println("创建一个线程,名称为:" +threadName);
         threadNo.incrementAndGet();
         Thread  thread = new Thread(targert,threadName);
         thread.setDaemon(true);
            return thread;
        }
    }
@Test
    public void testThreadFactory(){

       ExecutorService pool =  Executors.newFixedThreadPool(2,new SimpleThreadFactory());

       for (int i =0;i<5;i++){
           pool.submit(new ThreadPoolDemo.TargetTask());
       }

        try {
            Thread.sleep(1000);
            System.out.println("关闭线程");
            pool.shutdown();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

  运行结果