Java线程池-简识

Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或者并发执行的程序都可以使用线程池,在开发过程中,合理的使用线程池能够带来三个好处:
第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。

线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后 
启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕, 
再从队列中取出任务来执行。他的主要特点为:线程复用;控制最大并发数;管理线程。 

线程复用
每一个 Thread 的类都有一个 start 方法。 当调用 start 启动线程时 Java 虚拟机会调用该类的 run 方法。 那么该类的 run() 方法中就是调用了 Runnable 对象的 run() 方法。 我们可以继承重写 Thread 类,在其 start 方法中添加不断循环调用传递过来的 Runnable 对象。 这就是线程池的实 现原理。循环方法中不断获取 Runnable 是用 Queue 实现的,在获取下一个 Runnable 之前可以 是阻塞的。

线程池的组成 
一般的线程池主要分为以下 4 个组成部分:
1. 线程池管理器:用于创建并管理线程池 
2. 工作线程:线程池中的线程 
3. 任务接口:每个任务必须实现的接口,用于工作线程调度其运行 
4. 任务队列:用于存放待处理的任务,提供一种缓冲机制 
Java 中的线程池是通过 Executor 框架实现的,该框架中用到了 Executor,Executors, 
ExecutorService,ThreadPoolExecutor ,Callable 和 Future、FutureTask 这几个类。

Java 线程池工作过程
1. 线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面 
有任务,线程池也不会马上执行它们。 
2. 当调用 execute() 方法添加一个任务时,线程池会做如下判断: 
a) 如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务; 
b) 如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列; 
c) 如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要 
创建非核心线程立刻运行这个任务; 
d) 如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池 
会抛出异常 RejectExecutionException。 
3. 当一个线程完成任务时,它会从队列中取下一个任务来执行。 
4. 当一个线程无事可做,超过一定的时间(keepAliveTime)时,线程池会判断,如果当前运 
行的线程数大于 corePoolSize,那么这个线程就被停掉。所以线程池的所有任务完成后,它 
最终会收缩到 corePoolSize 的大小。

Java创建线程池的常用方式:
1、newCachedThreadPool创建一个可缓存的线程池,如果线程池长度超过处理需求,可灵活回收空闲线程,若无可回收线程,则创建线程。
示例代码:
private static void CachedThreadPool(){
ExecutorService cachedThreadPool=Executors.newCachedThreadPool();
for(int i=0;i<10;i++){
 final int index=i;
 cacheThreadpool.execute(new Runnable(){
 public void run(){
 Sysrem.out.println(Thread.currentThread.getId()+"==>"+);
}
});
}
}
2、newFixedThreadPool创建一个定长线程池,可控制线程最大的并发数,超出的线程会在队列中等待。
示例代码:
public static void FixedThreadPool(){
//创建可固定长度的线程池
ExecutorService fixedThreadPool=Executors.newFixedThreadPool(3);
//创建十个线程
for(int i=0;i<10;i++){
 int index=i;
 fixedThreadPool.execute(new Runnable(){
@Override
 public void run(){
 Sysrem.out.println("threadName:"+Thread.currentThread().getName()+",i"+index);
}
});
}
}
3、newScheduledThreadPool创建一个长线程池,支持定时及周期性任务执行。
示例代码:
public static void ScheduledThreadPool(){
//创建可定时线程
ExecutorService scheduledThreadPool=Executors.newScheduledThreadPool(5);
//创建十个线程
for(int i=0;i<10;i++){
 int index=i;
 newScheduledThreadPool.schedule(new Runnable(){
@Override
 public void run(){
 Sysrem.out.println("i:"+temp);
}
},3,TimeUnit.SECONDS);
}
}
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值