逐梦少年,看你能不能发现宝藏(18)

futureTask = new FutureTask<>(new MyThread2());new Thread(futureTask,"AAA").start();new Thread(futureTask,"BBB").start();int result02 = futureTask.get();System.out.println(Thread.currentThread().getName()+"******************************");int result01 = 100;/*while (!futureTask.isDone()) {}*///建议放在最后,要求获得Callable线程的计算结果,如果没有计算完成就要去强求,会导致阻塞,直到计算完成System.out.println("********result"+(result01+result02));}}
31.线程池用过么?谈谈你的理解?
线程池做的工作是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其他线程执行完毕 。再从队列中取出任务来执行 。
他的主要特点为: 线程复用:控制最大并发数:管理线程 。
第一:降低资源消耗 。通过重复利用已创建线程降低线程创建和销毁造成的消耗 。
第二:提高响应的速度 。当任务到达时,任务可以不需要的等到线程创建就能立刻执行 。
第三:‘提高线程的可管理性 。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配,调优和监控 。
常用的线程池:三种,实际一共5种,一种带线程调度的,还有一种是java8新特性带着一个线程池,底层都是类上进行的修改 。
Executors.newFixedThreadPool(10);---》一池固定数线程,就代表10个线程,适用于执行长期任务下面是对应着上一个的源码public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue());}-----------------------------------------------------------------------------------------------------------------------Executors.newSingleThreadExecutor();---------》一池一线程public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue()));}-----------------------------------------------------------------------------------------------------------------------Executors.newCachedThreadPool();-----------》一池多线程public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue());}=========================== 5种参数:=============================================================int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue workQueue
创建固定线程数的线程池,特点如下:
? 1.创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列种等待 。执行长期的任务,性能好很多 。
? 2.创建的线程池和值是相等的,它使用的
创建单一线程数的线程池,特点如下:
? 1.创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定的顺序执行 。一个任务一个任务执行的场景 。
? 2.tor将和值都设置为1,它使用的
创建可缓存线程池特点如下:
? 1.创建一个可缓存线程池,如果线程长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程 。适用于:执行很多短期异步的小程序或者负载较轻的服务器 。
? 2.,也就是说来了任务就创建线程运行,当线程空闲超过60秒,就销毁线程
小总结,都是在这个类上改造的,都需要用到阻塞队列 。
常用的有5个参数,实际上传入的是7个参数 。
1.: 线程池中的常驻核心线程数 。在创建了线程池后,当有请求任务来之后 。就会安排池中的线程去执行请求任务,近似理解为今日当值线程 。当线程中的线程数目达到后,就会把达到的任务放到缓存队列当中 。