-
什么是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
- Looper.prepare怎样创建MessageQueue
-
-
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();形成回调
-
-
-
-
Thread
最新推荐文章于 2024-10-08 14:09:57 发布