队列一个特性:fifo(先进先出)。 写入:如果队列满了,就必须阻塞等待。 取出:如果队列是空的,必须阻塞等待生产。 AbstracQueue 非阻塞队列 四种方式 BlockingQueue 阻塞队列 Deque 双端队列 SynchronizedQueue: 同步队列。没有容量,进去一个元素必须等待取出来再往里面放一个元素。放put 取take。put了艺元素,必须从里面先take取出来。
线程池
程序的运行,本质:占用系统的资源。优化资源的使用==>池化技术 池化技术:事先准备好一些资源,有人要用。就来我这拿。用完之后还给我。 三大方法、七种参数、四种拒绝策略
线程池的好处:
- 降低资源的消耗。
- 提高响应效率。
- 方便管理。
- 线程复用可控制最大并发数、管理线程
public ThreadPoolExecutor(int corePoolSize //核心线程池大小,
int maximumPoolSize //最大核心线程池大小,
long keepAliveTime //存活时间 超时了没有人调用 就会释放,
TimeUnit unit //超时单位,
BlockingQueue<Runnable> workQueue //阻塞队列,
ThreadFactory threadFactory //线程工厂 创建线程 一般不用动,
RejectedExecutionHandler handler //拒绝策略
) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.acc = System.getSecurityManager() == null ?
null :
AccessController.getContext();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
四种拒绝策略
new ThreadPoolExecutor.AbortPolicy() //如果队列满了 还有请求进来 就不处理这个队列并抛异常 new ThreadPoolExecutor.CallerRunsPolicy() // 哪来的去哪里 new ThreadPoolExecutor.DiscardPolicy() // 如果队列满了 还有请求进来 就不处理这个队列 不会抛异常 new ThreadPoolExecutor.DiscardOldestPolicy() // 队列满了 尝试和最早的竞争 如果竞争失败就没了 不会抛出异常
最大线程该如何定义
- CPU密集型 电脑几核就是几。可以保持CPU的效率最高。Runtime.getRuntime().availableProcessors()
- IO密集型 判断你的程序中十分耗IO的线程 大于数
四大函数式接口
只有一个方法的接口:比如Runnable接口。简化编程模型,在新版本的框架大量应用。
Supplier:供给型接口 无参一返回
Consumer:消费型接口 一参无返回
Fcuntion:函数型接口 一参一返回
Predicate:断定型接口 一参返回boolbean
Stream流式计算
存储+计算
User u2 = new User(2,"b",21);
User u3 = new User(3,"n",22);
User u4 = new User(4,"g",23);
User u5 = new User(5,"m",24);
List<User> users = Arrays.asList(u1, u2, u3, u4, u5);
// 过滤
users.stream()
.filter(u->{return u.getId() % 2 == 0;})
.map(u->{return u.getName().toUpperCase();})
.sorted((uu1,uu2)->{return uu2.compareTo(uu1);})
.limit(1)
.forEach(u->{
System.out.println(u);
});
ForkJoin
jdk1.7之后出来的。并行执行任务!提高效率。大数据中用到。把大任务拆分成小人物 特定:工作窃取。里面维护的都是双端队列。a.b线程。b先执行完,可以把a没执行完的线程再执行 并行流