Thread

  • 什么是Thread

    • CPU 调度,比进程更小,别在主线程中画UI

      • 五种状态

      • 方法

  • 创建线程

    • 重写run方法
    • 继承Runnable,重写run方法
  • 控制线程执行顺序

    • thread.join();

      • 不能手动中断。
    • synchronized

      • 自动解锁

      • notify(),wait()

        • 通过标志位修改它们wait和notify
    • 线程池

      • 种类

        • 单线程化线程池(newSingleThreadExecutor):串行执行所有任务

        • 可控最大并发数线程池(newFixedThreadPool(3)):设置最大数线程后并行

        • 可回收缓存线程池(newCachedThreadPool):用完回收但无法设置最大数线程

        • 支持定时与周期性任务的线程池(newScheduledThreadPool)。

          • scheduleAtFixedRate(根据线程运行时间)

            • 如果间隔时间大于任务的执行时间,任务不受执行时间的影响。如果间隔时间小于任务的执行时间,那么任务执行结束之后,会立马执行,至此间隔时间就会被打乱。
          • scheduleWithFixedDelay(根据设置的定时时间)

            • 间隔时间不会受任务执行时间长短的影响。
      • 使用方法

        • Executors.new…Executor();新建线程池

        • 创建线程

          • 1:execute:通过线程池创建线程。

          • 2:先创建;再submit():提交任务。

        • shutdown():关闭线程池,拒绝新任务。

    • 使用线程的Condition(条件变量)方法

      • 使用lock:ReentrantLock

        • 手动解锁:unlock;上锁:lock
      • 创建监听器:newCondition

      • signal == notify ,await == wait

    • 使用线程的CountDownLatch(倒计数)方法

      • 等待其他任务A,B执行完毕之后才能执行C

        • 新建计数器:new CountDownLatch(2)

        • 每次减1:countDown()

        • 等到为0,启动另外线程:await()

    • 使用CyclicBarrier(回环栅栏)实现线程按顺序运行(无用)

      • 实现让一组线程等待至某个状态之后再全部同时执行。

        • 新建 回环栅栏:new CyclicBarrier();

        • 减1等待:await();

    • 使用Sephmore(信号量)实现线程按顺序运行

      • 新建信号量 new Semaphore

      • 释放release

      • 接收acquire

  • 处理消息

    • MessageQueue

      • 存放Message或Runnable对象的消息队列,对应一个Looper对象

      • 主线程创建时,会创建一个默认的Looper对象

      • 非主线程创建时,需Looper.prepare创建。

        • Looper.prepare怎样创建MessageQueue
          • 创建Looper时调用nativeInit初始化MessageQueue同时创建Looper
    • Message

      • 消息体,用于装载需要发送的对象

        • 三种方式获取

          • new Message()

          • Handler.obtainMessage

          • Message.obtain(常用)

            • Message Pool(消息池)中看有没有可用的Message实例,有则调用,无则removeMessages再放入
        • 四个参数:

          • arg1:int

          • arg2:int

          • obj:任意

          • what:判断发送信息者

        • Message存储

          • 通过Message的参数

          • 通过bundle

            • bundle = new Bundle()

            • bundle.putString

            • message.setData(bundle)

        • 在handler中接收Message

          • 通过Message的参数

          • 通过bundle

            • msg.getData()

            • bundle.getInt()

    • Looper

      • 每个线程一个Looper,管理一个MessageQueue

        • Looper.prepare

          • 首先从ThreadLocal中获取Looper,要是Looper为空,就会抛出异常。并且Handler中的MessageQueue也是从mLooper中获取的。所以在一个线程中创建Handler之前,一定要首先在该线程中调用Looper的prepare函数初始化Looper:
        • Looper.loop

          • for死循环会使Looper一直在不断的从消息队列中通过MessageQueue的next方法获取Message

          • msg.target.dispatchMessage(msg)让该msg所绑定的Handler(Message.target)执行dispatchMessage方法以实现对Message的处理

      • 主线程的Looper是不允许退出的,子线程的Looper是允许退出的

    • Handler

      • 发送信息

        • 方法

          • sendEmptyMessage

          • sendMessage

          • sendMessageAtTime

            • 发送都会调用

            • 参数

              • 消息

              • 对应时间点

            • 将要发送的消息按发送时间点从小到大存放入MessageQueue

          • sendMessageDelayed

        • 接受、发送消息中回调原理

          • handler.obtainMessage调用了Message类的静态方法obtain(),并传递了一个this,handler将自身传给message

          • Message接收到Handler后调用handler.sendToTarget();形成回调

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值