阻塞队列

165 阅读1分钟

队列一个特性:fifo(先进先出)。 写入:如果队列满了,就必须阻塞等待。 取出:如果队列是空的,必须阻塞等待生产。 AbstracQueue 非阻塞队列 四种方式 BlockingQueue 阻塞队列 Deque 双端队列 SynchronizedQueue: 同步队列。没有容量,进去一个元素必须等待取出来再往里面放一个元素。放put 取take。put了艺元素,必须从里面先take取出来。

线程池

程序的运行,本质:占用系统的资源。优化资源的使用==>池化技术 池化技术:事先准备好一些资源,有人要用。就来我这拿。用完之后还给我。 三大方法、七种参数、四种拒绝策略

线程池的好处:

  1. 降低资源的消耗。
  2. 提高响应效率。
  3. 方便管理。
  4. 线程复用可控制最大并发数、管理线程
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() // 队列满了 尝试和最早的竞争 如果竞争失败就没了 不会抛出异常

最大线程该如何定义

  1. CPU密集型 电脑几核就是几。可以保持CPU的效率最高。Runtime.getRuntime().availableProcessors()
  2. 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没执行完的线程再执行 并行流

异步