线程的第四种创建方式:线程池
线程池七个参数
corePoolSize 核心线程池大小(一开始创建多少个线程)
maximumPoolSize 当任务过多,可以调整线程的最大值
keepAliveTime 保持存活时间
unit 时间单位(优化)
workQueue 阻塞队列
threadFactory 线程工厂()
handler 拒绝策略
线程池拒接策略:
AbortPolicy 当超过最大值后,会抛出异常,拒绝最后加进来的任务
DiscardPolicy 不抛出异常,拒绝最后加进来的任务
DiscardOldestPolicy 不抛出异常,拒接最前面加进来的任务
CallerRunsPolicy() 当超过最大值后,主线程执行这个任务并且阻塞后面的进去
清理核心线程:
executor.allowCoreThreadTimeOut(true);
代码
public static void main(String[] args) { //线程的第四种创建方式:线程池七个参数 //corePoolSize 核心线程池大小(一开始创建多少个线程) //maximumPoolSize 当任务过多,可以调整线程的最大值 //keepAliveTime 保持存活时间 //unit 时间单位(优化) //workQueue 阻塞队列 //threadFactory 线程工厂() //handler 拒绝策略 //拒接策略: //AbortPolicy 当超过最大值后,会抛出异常,拒绝最后加进来的任务 //DiscardPolicy 当超过最大值后,不抛出异常,拒绝最后加进来的任务 //DiscardOldestPolicy 当超过最大值后,不抛出异常,拒接最前面加进来的任务 //CallerRunsPolicy 当超过最大值后,主线程执行这个任务并且阻塞后面进去的任务 ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10,100, TimeUnit.SECONDS, new ArrayBlockingQueue<>(20), Executors.defaultThreadFactory(), new ThreadPoolExecutor.DiscardOldestPolicy()); for(int i = 0; i < 10; i++) { MyRunable run = new MyRunable(i + ""); executor.execute(run); } public class MyRunable implements Runnable{ String target; public MyRunable(String t) { this.target = t; } @Override public void run() { for(int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + "这是任务" + target); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
CAS和AAB(或者ABA)
CAS:(Compare And Swap) 比较并交换
CAS一种乐观锁(如果其他人先替换,我比较发现和选来值不一样,我就无法更改)
CAS引起AAB问题:A修改了A,当B过来替换时,比较发现的虽然是A,但已经不是它所要更改的A了,引起了冲突。(解决办法:设置一个单调递增的版本号)