JAVA常用的几种线程池
好久不写博客了,深感愧疚。最近写的一个需求,定时任务去发接口到大数据平台查询信息,六个小时查询大概30000次。测试环境下查询一次大概一秒,没想到到了生产上竟然要惊人的4秒一次! 很显然,单线程无法完成工作。看了我们系统里的线程池,原话是这么说的“Executors.newFixedThreadPoll(5)”,好吧,只有五条,心累。。
啊啊工作好累~下次写
一、线程池的优点
线程池的优点就是节约时间,因为线程的创建和销毁都需要大量资源,线程池相当于先把线程统一都创建出来,相当于懒汉模式?是一种用空间换时间的做法。
二、线程池的缺点
首先多线程的危险就在于容易造成死锁,是由于多个线程之间共享变量造成的,其次线程池在一次性创建了很多线程的情况下,虽然调用的时候效率更高,但是一旦线程池被创建出来,资源就会一直被占用,可能会造成资源不足。
三、常用线程池
1、newFixedThreadPool:这是一种固定线程数的线程池,当前线程数大于总数则会等待。最常用的线程池,用多少线程,创建的时候带个参数就行了,相对来说占用内存也不大。
private static ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);//线程数 fixedThreadPool.execute(new Runnable() {
public void run(){
//业务逻辑
}
});
2、newCachedThreadPool:缓存线程池,可无限大,当一个线程的任务执行完后,再有任务会服用这个线程,如果线程一段时间(默认1min)没有新的任务,就会终止该线程,有新任务时则会新创建线程。
public class ThreadPoolCached { public static void main(String[] args) { ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { final int index = i; try { Thread.sleep(index * 100); }catch (Exception e) { e.printStackTrace(); } cachedThreadPool.execute(new Runnable() { @Override public void run() { System.out.println(index+"当前线程"+Thread.currentThread().getName()); } }); } }
执行结果均为线程1,因为线程1已经执行完当前任务,再有任务进来会复用线程1。
3、ScheduledThreadPool:定时任务线程池,这没什么好说的,其实就是FixedThreadPool的定时任务版本
public class ScheduledThreadPool { private static ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4); public static void main(String args[]){ for(int i=0;i<10;i++){ System.out.println("线程"+i+"开始执行,时间"+new Date()); scheduledThreadPool.schedule(new Runnable() { public void run(){ System.out.println(Thread.currentThread().getName()+"正在被执行"); System.out.println(new Date()); } }, 3, TimeUnit.SECONDS);//定时任务 } } }
创建了4个线程,均在3秒后开始创建。
4、newSingleThreadExecutor:单线程线程池,用来保证只用唯一的线程来执行,保证先进先出(FIFO),顺序执行不插队。。这个我真不知道有什么用。哈哈~

浙公网安备 33010602011771号