【并发编程】- Executors 有界线程池定制线程工厂

87 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

使用newFixedThreadPool(int,ThreadFactory)定制线程工厂

线程工厂类代码如下:

public class TheThreadFactory implements ThreadFactory {
    @Override
    public Thread newThread(Runnable r) {
        Thread thread = new Thread(r);
        thread.setName("定制线程工厂中的线程对象的名称:"+Math.random());
        return thread;
    }
}

运行类代码如下:

public class FixedThreadPoolRun {
    public static void main(String[] args) {
        TheThreadFactory theThreadFactory = new TheThreadFactory();
        ExecutorService executorService = Executors.newFixedThreadPool(2,theThreadFactory);
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println(Thread.currentThread().getName()+"  在运行 开始时间:"+System.currentTimeMillis());
                    Thread.sleep(2000);
                    System.out.println(Thread.currentThread().getName()+"  在运行 结束时间:"+System.currentTimeMillis());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        for (int i = 0; i < 4 ; i++) {
            executorService.execute(runnable);
        }
    }
}

运行结果如下:

定制线程工厂中的线程对象的名称:0.6318172237070142  在运行 开始时间:1653893425444
定制线程工厂中的线程对象的名称:0.3077920966680078  在运行 开始时间:1653893425444
定制线程工厂中的线程对象的名称:0.3077920966680078  在运行 结束时间:1653893427445
定制线程工厂中的线程对象的名称:0.6318172237070142  在运行 结束时间:1653893427445
定制线程工厂中的线程对象的名称:0.6318172237070142  在运行 开始时间:1653893427448
定制线程工厂中的线程对象的名称:0.3077920966680078  在运行 开始时间:1653893427449
定制线程工厂中的线程对象的名称:0.3077920966680078  在运行 结束时间:1653893429455
定制线程工厂中的线程对象的名称:0.6318172237070142  在运行 结束时间:1653893429455

从运行结果看出同一时间只有2个线程在线程池中被使用,因为创建一个大小为2的有界线程池。

在开发服务器端应用时,应用需要处理执行时间短而数目却非常巨大的请求,如果为每一个请求创建一个新的线程,会导致性能上的瓶颈,因为线程对象的创建和销毁需要JVM频繁地进行处理,如果请求的执行时间很短,可能花在创建和销毁线程对象上的时间大于真正执行任务的时间,如果这样,则系统性能大幅降低,所以应用对应线程池管理线程对象