持续创作,加速成长!这是我参与「掘金日新计划 · 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频繁地进行处理,如果请求的执行时间很短,可能花在创建和销毁线程对象上的时间大于真正执行任务的时间,如果这样,则系统性能大幅降低,所以应用对应线程池管理线程对象