多线程

  • 线程通讯

    • java.long.Object

      • wait() 释放了所持有的监视器对象上的锁,导致当前的线程等待

      • notify() 随机唤醒等待的线程

      • notifyAll() 唤醒正在等待一个给定对象的所有线程

  • 管道流通讯

    • 死锁

      • 在一个线程中同时使用管道输入流和管道输出流

    • sleep和wait的区别

      • sleep方法由Thread类提供,不会释放线程锁

      • wait方法由Object类提供,所有java类都具备wait方法,导致当前的线程等待,直到其他线程调用此对象的notify()或notifyAll()

  • 线程高级调度

    • 线程池

      • 概念

        • 一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后启用这些任务

        • 线程池线程都是后台线程

      • 作用

        • 解决线程生命周期开销问题和资源不足问题

      • 模式

        • HS/HA半同步/半同步模式

          • 同步层

          • 队列层

          • 异步层

        • L/F领导者与随意者模式

          • 领导者leader

          • 追随者 follower

          • 工作者processor

        • 组成

          • 线程池管理器 ThreadPooManager 创建管理线程池

          • 工作线程 WorkThread 线程池中线程

          • 任务接口 Task 每个任务必须实现的接口,以供工作线程调度任务的执行

          • 任务队列 存放没有处理的任务,提供一种缓冲基准

          • 执行以下线程:

            class ExecutorThread extends Thread{
              boolean funningFlag=false;
              private Runnable callBack=null;
              public void setCallBack(Runnable callBack){
                this.callBack=callBack;
              }
              public synchronized void setRunning(boolean flag){
                runningFlag=flag;
                if(flag)
                  this.notify();//如果flag为true说明希望执行线程处理某一个具体的任务
              }
              public synchronized void run(){
                try{
                   while(true){
                      if(!runningFlag){
                         this.wait();//任务执行结束后阻塞本线程
                       }else{
                         callBack.run();
                         setRunning(false);
                      }
                  }
                }catch(Exception e){}
              }
            }
          • 调度器

            public class ThreadExecutor{
              private List<ExecutorThread>thread;
              public ThreadPoolExecutor(int threadCount){
                threads=Collection.synchronizedList(new ArrayList<ExecutorThread>());
                for(int i=0;i<threadCount;i++){
                  ExcutorThread thread=new ExcutorThread();
                  threads.add(thread);
                  thread.start();
                }
              }
              public void execute(Runnable callBack){
                int i;
                for(int i=0;i<callBack;i++){
                  ExecutorThread currentThread=thread.get(i);
                  if(!currentThread.runningFlag){
                    currentThread.setCallBack(callBack);
                    currentThread.setRunning(true);
                    return;
                  }
                }
                 if(i==threeads.size()){
                   System.out.println("线程资源已用完,请稍等片刻")
                 }
              }
            }
    • 信号量 Semaphore

      • 信号灯

      • 多线程环境下使用的一种设施,负责协调各个线程,以保证它们能够正确、合理的使用公共资源

      • 信号量提供一个方法添加一个许可,从而可能释放一个正在阻塞的获取者

      • 实现示例:

        public class Semaphore{
          private List<Object> locks=Collections.synchronizedList(new ArrayList<Object()>);
          private int permitNum=1;
          private int nowPermitNum=1;
          private boolean permitNumGrow=false;
          Random random=new Random();
        
          public Semaphore(int permitNum,boolean permitNumGrow,boolean fair){
            this.ppermitNum=permitNum;
            this.permitNumGrow=permitNumGrow;
            this.fair=fair;
          }
          public Semaphore(int permitNum){
            this(permitNum,true,false);
          }
          public Semaphore(){
            this(i);
          }
          public void acquire(){
            Object lock=new Object();
            synchronized(lock){
              if(nowPermitNum>0){
                nowPermitNum--;
              }else{
                locks.add(lock);
                try{
                  lock.wait();//如果当前没有可用许可则等待
                }catch(Exception x){
                  ex.printStackTracce();
                }
              }
            }
          }
          public void release(){
            if(locks.size>0){
              int index=0;
              if(!fair){
                index=Math.abs(random.nextInt())%locks.size();
              }
              Object lock=new lock.get(index);
              locks.remove(lock);
              synchronized(lock){
                lock.notify();
              }
            }else if(nowPermitNum<permitNum || permitGrow){
              nowPermitNum++;
            }
          }
          public int getAvablePermitNum(){
            reutrn nowPermitNum;
          }
        }
    • 生产者-消费者模式

      • 概念

        • 一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者从仓库取走产品

        • 生产者-消费者=仓库

      • 规则

        • 仓库未满时生产,仓满停止生产

        • 消费者有产品时消费,仓空等待

        • 当消费者发现仓储没有产品时则通知生产者生产

        • 当生产者生产出可消费产品时,应通知消费者去消费

    • 线程池调度器

      • Executor框架 可以提交可执行任务的工具

      • Executors 主要工具类 提供一系列工厂方法用来创建任务执行器,返回的任务执行器都实现了ExecutorService接口

        • 主要接口

          • ScheduledExecutorSeervice

          • ExecutorService 异步的管理一个或多个线程终止、执行过程(Future)的方法

          • Executor 替代显示的创建和运行线程

      • ExecutorService

        • executor(Runnable) 接收一个java.long.Runnable对象作为参数

           public class ExecutorRunnableTest{
            public static void main(String args[]){
              ExecutorService executorService=Executors.newStrignThreadExcutor(); //创建执行器
              excutorService.excutor(new Runnable(){ //调度任务
                public void run(){
                  System.out.println("执行异步任务");
                }
              });
              excutorService.shutdown();
            }
          }
        • submit(Runnable)

          public class SubmitRunnableTest{
            public static void main(String args[]){
              ExecutorService executorService=Executors.newStrignThreadExcutor(); //创建执行器
              Future future=excutorService.submit(new Runnable(){
                public void run(){
                  System.out.println("执行异步任务");
                }
              });
              System.out.println("future.get()+"+future.get());//调用get()方法会导致线程阻塞直到异步任务执行完成,Runnable无法返回结果,因此始终获取到null
          
            }
          }
        • submit(Callable)

          • 有返回值

          • 可以从submit(Callable)返回的Future对象中获取

        • invokeAny()

          • 接收一个包含Callable对象的集合作为参数

          • 不返回Future对象

          • 如有任务运行完毕或抛出异常,方法会取消它的Callable的执行

        • invokeAll()

          • 调用存在参数集合中的索引Callable对象

          • 返回一个包含Future对象的集合

          • 可能会有异常导致运行结束,不代表运行成功

      • 立即关闭ExecutorService

        • shutdownNow()

    • 锁对象 Lock 接口

      • 默认实现 ReentrantLock

        • 可重入的独占锁 与synchronized 有相同的表现和更清晰的语义

        • 公平锁

        • 非公平锁

    • ThreadLocal 线程局部变量

      • 访问

        • get()

        • set()

        • remve()

        • initialValue()

        • get()

      • 作用

        • 解决多线程程序的并发问题

        • 是Thread的局部变量

        • 目标变量是线程的本地变量

    • 原子操作类

      • 概念

        • 相当于泛化的volatile变量

        • 支持原子读取-修改-写操作

      • java.util.concurrent.atomic 包四种类型的原子更新类

        • 原子更新基本类型

        • 原子更新数组类型

        • 原子更新引用

        • 原子更新属性

      • 原子更新基本类型

        • AtomicBoolean

        • AtomicInteger

        • AtomicLong

      • 通过原子更新数组里的某个元素

        • AtomicIntegerArray 整形

        • AtomicLongArray 更新长整形数组某个元素

        • AtomicReferenceArray 更新引用类数组的某个元素

      • AtomicIntergerArray常用方法

        • int addAndSet(int i,int delta) 以原子方式将输入值与数组中索引为i的元素相加

        • boolean compareAndSet(int i,int expect,int update) 如果当前值等于预期值,则以原子方式更新数组中索引为i的值为update值

      • 更新引用类型涉及的变量

        • AtomicReference 原子更新引用类型

        • AtomicReferenceFiledUpdater 原子更新引用类型里的字段

        • AtomicMarkableReference 原子更新带有标记位的引用类型

      • 更新字段类

        • AtomicIntegerFieldUpdater 原子更新整形字段

        • AtomicLongFiledUpdater 原子更新长整形字段

        • AtomicStampedReference 原子更新带有版本号的引用类型

      • 原子更新字段方法

        • 每次必须使用newUpdater创建一个更新器,设置想要跟新的类的字段

        • 更新类的字段(属性)必须为public volatile

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值