java高级之线程池的创建

目录

1、线程池的创建分两种

2、Executors创建线程池的6种方法

2.1、newSingleThreadExecutor:创建单个线程的线程池

2.2、newFixedThreadPool:创建一个固定大小的线程池

2.3 newCachedThreadPool:带缓存的线程池,适用于短时间有大量任务的场景,但有可能会占用更多的资源;线程数量随任务量而定。

2.4 newSingleThreadScheduledExecutor:创建执行定时任务的单个线程的线程池

2.5 newScheduledThreadPool:创建执行定时任务的线程池

2.6 newWorkStealingPool:根据当前设备的配置自动生成线程池

2.7 ThreadPoolExecutor手动创建线程池


1、线程池的创建分两种

  • 通过Executors自动创建
  • 通过ThreadPoolExecutor手动创建

2、Executors创建线程池的6种方法

2.1、newSingleThreadExecutor:创建单个线程的线程池

ExecutorService singleExecutor = Executors.newSingleThreadExecutor();

for(int i = 0; i < 5; i++){
	singleExecutor.submit(()->{
	    System.out.println(Thread.currentThread().getName() + "---");
    });
}

singleExecutor.shutdown();//当线程任务执行完毕后,释放资源

结果:

 可以看到仅有一个线程在执行。

2.2、newFixedThreadPool:创建一个固定大小的线程池

ExecutorService singleExecutor = Executors.newFixedThreadPool(4);//创建4个固定长度的线程池

for(int i = 0; i < 5; i++){
	singleExecutor.submit(()->{
		System.out.println(Thread.currentThread().getName() + "---");
	});
}

singleExecutor.shutdown();//当线程任务执行完毕后,释放资源

结果:

可以看到创建了4个线程来执行任务。

2.3 newCachedThreadPool:带缓存的线程池,适用于短时间有大量任务的场景,但有可能会占用更多的资源;线程数量随任务量而定。

ExecutorService singleExecutor = Executors.newCachedThreadPool();

for(int i = 0; i < 50; i++){
	singleExecutor.submit(()->{
		System.out.println(Thread.currentThread().getName() + "---");
	});
}

singleExecutor.shutdown();//当线程任务执行完毕后,释放资源

结果:

可以看到50个任务仅创建了16个线程来处理。

2.4 newSingleThreadScheduledExecutor:创建执行定时任务的单个线程的线程池

 ScheduledExecutorService service= Executors.newSingleThreadScheduledExecutor();
        System.out.println("添加任务:"+ LocalDateTime.now());
        service.schedule(new Runnable() {

                @Override
                public void run() {
                    System.out.println("执行任务:"+LocalDateTime.now());
                }
            },3,TimeUnit.SECONDS);//推迟3秒执行任务

结果:时间相差 3s

2.5 newScheduledThreadPool:创建执行定时任务的线程池

ScheduledExecutorService singleExecutor = Executors.newScheduledThreadPool(3);
long cur = System.currentTimeMillis()/1000;

System.out.println(System.currentTimeMillis()/1000 - cur);
for(int i = 0; i < 10; i++){
	singleExecutor.schedule(()->{
		System.out.println(System.currentTimeMillis()/1000 - cur);
		System.out.println(Thread.currentThread().getName()+"----");
	}, 3, TimeUnit.SECONDS);

}

singleExecutor.shutdown();//当线程任务执行完毕后,释放资源

结果:

 可以看出延迟3s执行

2.6 newWorkStealingPool:根据当前设备的配置自动生成线程池

ExecutorService singleExecutor = Executors.newWorkStealingPool();
	long cur = System.currentTimeMillis()/1000;
	for(int i = 0; i < 10; i++){
		singleExecutor.submit(()->{
			System.out.println(Thread.currentThread().getName()+"----");
	    });

}

singleExecutor.shutdown();//当线程任务执行完毕后,释放资源

结果:

 根据自身电脑配置决定创建的线程数目

2.7 ThreadPoolExecutor手动创建线程池

创建一个延迟执行线程池

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,
															   3,
													           2,
												TimeUnit.SECONDS,
												new ArrayBlockingQueue<>(3));
for(int i = 0;i < 6; i++){
	threadPoolExecutor.submit(()->{
		System.out.println(Thread.currentThread().getName()+"----");
	});
}
threadPoolExecutor.shutdown();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值