栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

黑马程序员线程池

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

黑马程序员线程池

什么是线程池

 线程池就是一个可以复用线程的技术。、

 不使用线程池的问题

  如果用户每发起一个请求,后台就创建一个新线程来处理,下次任务来了又要创建新线程,而创建新线程的开销是很大的,这样会严重影响系统的性能。

谁代表线程池?

 JDK5.0起提供了代表线程池的接口:ExecutorService

如何得到线程池对象

 方式一:使用ExecutorService的实现类ThreadPoolExecutor自创建一个线程池对象。

ExecutorService

ThreadPoolExecutor

 方式二:使用Executors(线程池工具类)调用方法返回不同特点的线程池对象。

ThreadPoolExecutor构造器参数说明

参数一指定线程池线程数量(核心线程)corePoolSize不能小于0
参数二指定线程可支持的最大线程数maximumPoolSize最大数量>=核心线程数量
参数三指定临时线程的最大存活时间keepAliveTime不能小于0
参数四指定存活时间的单位(秒分时天)unit时间单位
参数五指定任务队列workQueue不能为null
参数六指定用哪个线程工厂创建线程threadFactory不能为null
参数七指定线程忙,任务满的时候,新任务来了怎么办handler不能为null

 线程池常见面试题

 临时线程什么时候创建?

新任务提交时发现核心线程都在忙,任务队列也满了,并且还可以创建临时线程,此时才会创建临时线程

 什么时候会开始拒绝任务?

核心线程和临时线程都在忙,任务队列也满了,新的任务过来的时候才会开始任务拒绝。

线程池处理Runnable任务

ExecutorService pool = new ThreadPoolExecutor(3,5,8,TimeUnit.SECONDS,new ArrayBlockingQueue<>(6),Executors.defaultThreadFactory(),new ThreaddPoolExecutor.AbortPolicy());
方法名称说明
void execute(Runnable command)执行任务/命令,没有返回值,一般用来执行Runnable任务
Future submit(Callable task)执行任务,返回未来任务对象获取线程结果,一般拿来执行Callable任务
void shutdow()等任务执行完毕后关闭线程池
List shutdownNow()立刻关闭,停止正在执行的任务,并返回队列中未执行的任务

 代码实现


import java.util.concurrent.*;


public class ThreadPoolDemo1 {
    public static void main(String[] args) {
//        1,创建线程池对象
        ExecutorService pool =new ThreadPoolExecutor(3,5,6,
                TimeUnit.SECONDS, new ArrayBlockingQueue<>(5),
                Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
//        给任务让线程池处理
        Runnable target=new MyRunnable();//这不是线程,而是任务对象
        pool.execute(target);
        pool.execute(target);
        pool.execute(target);
        pool.execute(target);
        pool.execute(target);
 //当任务不超过8(3个核心线程+5个任务队列)个 不会创建临时线程。
//此线程池最多可以同时执行10(8+2个临时线程)个任务      


    }
}
—————————————————————————————————————————————————————————————————————————————————————————


public class MyRunnable implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(Thread.currentThread().getName()+"输出了:离谱"+i);
        }
    }
}

新任务拒绝策略

策略详解
ThreadPoolExecutor.AbortPolicy丢弃任务并抛出RejectedExecutionException异常。这是默认的策略
ThreadPoolExecutor.DiscardPolicy丢弃任务,但不抛出异常。这是不推荐的做法
ThreadPoolExecutor.DiscardOldestPolicy抛弃队列中等待最长的任务 然后把当前任务加入队列中
ThreadPoolExecutor.CallerRunsPolicy由主线程负责调用任务的run()方法从而绕过线程池直接执行

 线程池处理Callable任务


import java.util.concurrent.*;

public class ThreadPoolDemo2 {
    public static void main(String[] args)throws Exception {
        //        1,创建线程池对象
        ExecutorService pool =new ThreadPoolExecutor(3,5,6,
                TimeUnit.SECONDS, new ArrayBlockingQueue<>(5),
                Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
//        给任务让线程池处理
        Callable callable=new MyCallable(100);
        Futuref1= pool.submit(callable);
        Futuref2= pool.submit(callable);
        Futuref3= pool.submit(callable);
        Futuref4= pool.submit(callable);
        Futuref5= pool.submit(callable);
        Futuref6= pool.submit(callable);
        System.out.println(f1.get());
        System.out.println(f2.get());
        System.out.println(f3.get());
        System.out.println(f4.get());
        System.out.println(f5.get());
        System.out.println(f6.get());
        
    }
}
—————————————————————————————————————————————————————————————————————————————————————————


import java.util.concurrent.Callable;

public class MyCallable implements Callable {
    private int n ;
    public MyCallable(int n){
        this.n=n;
    }

    @Override
    public String call() throws Exception {
        int sum=0;
        for (int i = 0; i <= n; i++) {
            sum += i;
        }
        return Thread.currentThread().getName()+"执行结果是:"+sum;
    }
}

Executors得到线程池对象的常用方法

 Executors:线程池工具类通过调用方法返回不同类型的线程池对象。

方法名称说明
public static ExecutorService newCachedThreadPool()线程数量随着任务增加而增加,如果线程任务执行完毕且空闲了一段时间则会被回收掉。
public static ExecutorService newFixedThreadPool(int nThreads)创建固定线程数量的线程池,入过某个线程因为执行异常而结束,那么线程池会补充一个新的线程替代它。

public static ExecutorService newSingleThreadExecutor()

创建只有一个线程的线程池对象,如果该线程出现异常而结束,那么线程池会补充一个新的线程
public static ScheduleExecutorService newScheduledThreadPool(int corePoolSize)创建一个线程池,可以实现在给定的延迟后运行任务,或者定期执行任务。

注意:Executors的底层也是基于线程池的实现类ThreadPoolExecutor创建的线程池对象。


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolDemo3 {
    public static void main(String[] args) {
        ExecutorService pool= Executors.newFixedThreadPool(3);
        Runnable runnable=new MyRunnable();
        pool.execute(runnable);
        pool.execute(runnable);
        pool.execute(runnable);
        pool.execute(runnable);

    }
}

 Executors使用可能会存在陷阱

 大型并发系统环境中使用Executors如果不注意可能会出现系统风险(OOM)。

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1007371.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号