Java中的线程池

Java中的线程池概述:

Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序 都可以使用线程池。

在开发过程中,合理地使用线程池能够带来3个好处:

  • 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  • 提高响应速度。当任务到达时,就能立即执行,而不需要等待线程创建的过程。
  • 提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源, 还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用 线程池,必须对其实现原理了如指掌。

线程池的实现原理

当向线程池提交一个任务之后,线程池是如何处理这个任务的呢?

从图中可以看出,当提交一个新任务到线程池时,线程池的处理流程如下。
1)线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作 线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下个流程。
2)线程池判断工作队列是否已经满。如果工作队列没有满,则将新提交的任务存储在这 个工作队列里。如果工作队列满了,则进入下个流程。
3)线程池判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程 来执行任务。如果已经满了,则交给饱和策略来处理这个任务。

ThreadPoolExecutor执行execute()方法的示意图,如图所示:
在这里插入图片描述

线程池的使用

我们可以通过new ThreadPoolExecutor来创建一个线程池:

new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, milliseconds,runnableTaskQueue, handler);

向线程池提交任务:
可以使用两个方法向线程池提交任务,分别为execute()submit() 方法。

execute() 方法 用于提交不需要返回值的任务,即:Runnable任务,所以无法判断任务是否被线程池执行成功。

threadsPool.execute(new Runnable() { 
	@Override 
	public void run() { 
	// TODO Auto-generated method stub 
	} 
});

submit() 方法用于提交需要返回值的任务,即Callbale任务。

	// 1 提交任务
	Future<Object> future = executor.submit(harReturnValuetask); 
	
	//2 获取任务的执行结果
	try { 
		Object s = future.get(); 
	} catch (InterruptedException e) { 
		// 处理中断异常 
	} catch (ExecutionException e) { 
		// 处理无法执行任务异常 
	} finally { 
		// 关闭线程池 
		executor.shutdown(); 
	}

线程池会返回一个 Future 类型的对象,通过这个 Future对象 可以判断任务是否执行成功,并且可以通过future的 get() 方法来获取返回值

注:get()方法会阻塞当前线程直到 当前线程所提交的所有任务都完成,而使用get(long timeout,TimeUnit unit) 方法则会阻塞当前线 程一段时间后立即返回,这时候有可能任务没有执行完。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java线程池的参数包括以下7个: 1. corePoolSize:线程池的基本大小,即在没有任务需要执行的时候线程池的大小。 2. maximumPoolSize:线程池最大的大小,即线程池允许的最大线数。 3. keepAliveTime:线程池线空闲后,保持存活的时间。 4. unit:keepAliveTime的时间单位。 5. workQueue:任务队列,用于保存等待执行的任务的阻塞队列。 6. threadFactory:线工厂,用于创建新线。 7. handler:拒绝策略,用于当任务队列已满,且线程池线数达到maximumPoolSize时,如何拒绝新任务的策略。 下面是一个示例代码,展示了如何使用Java线程池参数: ```java import java.util.concurrent.*; public class ThreadPoolDemo { public static void main(String[] args) { // 创建一个线程池 ThreadPoolExecutor executor = new ThreadPoolExecutor( 2, // corePoolSize 4, // maximumPoolSize 60, // keepAliveTime TimeUnit.SECONDS, // unit new ArrayBlockingQueue<Runnable>(4), // workQueue Executors.defaultThreadFactory(), // threadFactory new ThreadPoolExecutor.AbortPolicy() // handler ); // 任务 for (int i = 0; i < 10; i++) { executor.execute(new Task(i)); } // 关闭线程池 executor.shutdown(); } static class Task implements Runnable { private int num; public Task(int num) { this.num = num; } @Override public void run() { System.out.println("正在执行task " + num); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("task " + num + "执行完毕"); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值