====================
====================CallableDemo 线程
====================
class MyThread implements Callable<Integer>{
pubic Integer call() throws Exception{
System.out.println("8888888888888888");
return 1024;
}
}
public static void main(){
FutureTask<Integer> futureTask = new FutureTask<>(new MyThread());
Thread t1 = new Thread(futureTask,name:"AAA");
t1.start();
System.out.println("**************result:"+futureTask.get());
}
为什么用线程池,优势?
答:线程池做的工作主要是控制的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大
数量超出数量的线程排队等候,等其它线程执行完毕,再从队列中取出任务来执行。
他的主要特点为:线程复用;控制最大并发数;管理线程。
1、降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
2、提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
3、提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的
分配,调优和监控。
线程池如何使用?
架构说明:
Java中的线程池是通过 Executor 框架实现的,该框架中用到了Executor,Executors,ExecutorService,ThreadPoolExecutor这几个类。
一克Q特 一克塞K的
编码实现:
Executors.newScheduledThreadPool()//执行调度的带时间的
Executors.newWorkStealingPool(int)//java新增,使用目前机器上可用的处理器作为它的并行级别
重点:
ThreadPoolExecutor //线程池的底层就是这个类
//创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。LinkedBlockingQueue
Executors.newFixedThreadPool(int)//执行长期的任务,性能好很多 Fixed /fɪkst/ 费克思的
//创建一个单线程代的线程池,它只会用唯一的工作线程来执行任务,保证的有任务按照指定顺序执行。LinkedBlockingQueue
Executors.newSingleThreadExecutor()//一个任务一个任务执行的场景 Single /ˈsɪŋɡl/ 星狗 Executor /ɪɡˈzekjətə(r)/ 一克塞K的
//创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
SynchronousQueue,也就是说来了任务就创建线程运行,当线程空闲超过60秒,就销毁线程。
Executors.newCachedThreadPool()//适用:执行很多短期异步的小程序或者负载较轻的服务器 Cached 卡死t
例:
public static void main(String[] args){
ExecutorService threadPool = Executors.newFixedThreadPool(5);//一池5个处理线程
ExecutorService threadPool = Executors.newSingleThreadExecutor();//一池1个处理线程
ExecutorService threadPool = Executors.newCachedThreadPool();//一池N个处理线程
try{
for (int i=1;i<=10;i++){
threadPool.Execute(()->{
System.out.println(Thread.currentThread().getName()+"\t办理业务");
});
}
}catch(Exception e){
e.printStackTrace();
}finally{
threadPool.shutdown();
}
}
例:2
public static void main(){
ExecutorService service= Executors.newFixedThreadPool(10);
ThreadPoolExecutor service2 = (ThreadPoolExecutor)service;
service2.setCorePoolSize(15);
service2.setKeepAliveTime();
service.execute(new NumberThread);
service.shutdown();
}
ThreadPoolExecutor:线程池的低层就是这个类
线程池的几个重要参数介绍?
。。。
说说线程池的底层工作原理?
线程池的工作原理,几个重要参数,然后给了具体几个参数分析线程池会怎么做,最后问阻塞队列的作用是什么
答:线程池的七大参数
1、corePoolSize:线程池中的常驻核心 线程数 酷
在创建了线程池后,当有请求任务来之后,就会安排池中的线程去执行请求任务,近似理解为今日当值线程
当线程池中的线程数目达到corePoolSize后,就会把到达任务放到缓存队列当中
2、maximumPoolSize:线程池能够容纳同进执行的最大线程数,此值必须大于等于1
3、keepAliveTime:多余的空闲线程的存活时间。 Kp 饿赖夫 太么
当前线程池数量超过corePoolSize时,当空闲时间达到keepAliveTime值时,
多余空闲线程会被销毁直到只剩下 corePoolSize个线程为止。
4、unit:keepAliveTime的单位。
5、workQueue:任务队列,被提交但尚未被执行的任务。
6、threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程一般用默认的即可。
7、handler:拒绝策略,表示当队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时如何来
线程池用过吗?生产上你如何设置合于是理的参数
|----线程池的拒绝策略你谈炎
|---------等待队列也已经排满了,再也塞不下新任务了同时线程池中的max线程也达到了,无法继续为新任务服务。这时候我们就需要拒绝策略机制合理的处理这个问题。
|---------线程池的4种拒绝策略理论(JDK内置的拒绝策略)
|---------AbortPolicy(默认):直接抛出RejectedExecutionException异常阻止系统正常运行。饿不特
|---------CallerRunsPolicy:“调用者运行”一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量。酷了 万思 趴了s
|---------DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入队列中尝试再次提交当前任务。
|---------DiscardPolicy:直接丢弃任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种方案。
以上内置拒绝策略均实现了RejectedExecutionHandler接口
|----你在工作中单量的、固定数的、可变的三种创建线程池的方法,你用那个多?超级大坑
答:三种线程池一个都不用,我们生产上只能用自定义的Executors中JDK已经给你提供了,为什么不用?
线程池不允使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
说明:Executors返回的线程池对象的弊端如下:
1、FixedThreadPool和SingleThreadPool:
允许的请求队列长度为Integer.MAX_value,可能会堆积大量的请求,从而导致OOM。
2、CachedThreadPool和ScheduledThreadPool:
允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。