多线程常见问题描述
1 多线程优点
可以重复利用已有的线程继续执行任务,避免线程在创建和销毁时造成的消耗
调整可运行线程数量的大小
2 工作原理
提交任务->核心线程池是否已满->(未满)创建线程执行任务
->(已满)阻塞队列是否已满->(已满)将任务存储在队列中
->(未满)线程池是否已满->(未满)创建线程执行任务
->(已满)按照饱和策略进行处理
(1)判断核心线程池是否已满
(2)判断阻塞队列是否已满
(3)判断线程池是否已满
饱和策略即叫做拒绝策略
3 线程池分类
(1)ThreadPoolExecutor newChachedThreadPool newFixedThreadPool newSingleThreadExecutor
(2)ScheduledThreadPoolExecutor newSingleThreadScheduledExecutor newScheduledThreadPool
(3)ForkJoinPool newWorkStealingPool
4 synchronized的了解
作用:关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。
使用:实例方法、静态方法、代码块
5 Runnable接口和Callable接口区别
1)两个接口需要实现的方法名不一样,Runnable需要实现的方法为run(),Callable需要实现的方法为call()。
2)实现的方法返回值不一样,Runnable任务执行后无返回值,Callable任务执行后可以得到异步计算的结果。
3)抛出异常不一样,Runnable不可以抛出异常,Callable可以抛出异常。
6 Callable返回值意义在哪儿,不要返回值可以吗,什么时候需要用到返回值?
首先Callable是线程异步执行的结果状态,如果有两个线程A和B,B中的某个业务逻辑中需要确定A结束后才能进行,那么就需要获得线程A的执行结果。
设计背景:一个任务需要进行一系列操作,比如拷贝大量的基础数据,以及解析数据,并入库,由于数量大,整个过程需要持续十秒左右,用户体验差,需要降低到2~5s。
设计思路:经过分解过程,将拷贝数据分为一个过程,同时涵盖部分解析数据功能,剩下解析数据划为一个过程,两个过程异步执行,其中最后一个任务状态入库时需要将所有业务操作都执行完成后更新,此时就需要用到线程中的返回值。
7 有三个线程T1,T2,T3,如何保证顺序执行?
使用join()方法,在一个线程中启动另外2个线程,new Thread T3调用T2.join(),T2调用T1.join()。之后任意启动顺序都可以,T1.start(); T2.start();T3.start();
8 yield方法作用:暂停当前线程,让其他线程执行。