赞
踩
多线程很复杂的,内容很多的,大块的大家去看我多线程的文章,基本都涵盖到了,这里记录下面是的一些问题,怎么回答,不会大块介绍知识点
大家在复习多线程时需要学习下面的内容:
线程池、SYNC和Lock锁机制、线程通信、volatile、ThreadLocal、CyclicBarrier、Atom包、CountDownLatch、AQS、CAS原理
下面这些我就不写了:
atomic 与 volatile的区别?
Thread的 notify()给notifyAll()的区别?
notifiy()是唤醒的那一个线程?
Thread.sleep()唤醒以后是否需要重新竞争?
GC回收算法,及实现原理?
java 多线程基础部分
继承Thread类
实现Runnable接口
java 多线程进阶部分
wait()、notify() 等待通知方式
join() 方式
volatile 共享内存
CountDownLatch、CyclicBarrier 并发工具,功能和 join 相同
interrupt() 线程响应中断
线程池 awaitTermination() ,等待线程池任务结束方式,这种方式需要关闭线程池才有效
PipedWriter、PipedReader 管道通信方式
饿汉式单例模式的写法:线程安全
懒汉式单例模式的写法:非线程安全
双检锁单例模式的写法:线程安全
android 自身部分
先说 handle 的4个角色:
Handler - 消息发送器,内部持有一个 MessageQueue 消息队列,在发送消息时把 message.obj 指向 handle 自己,这样实现最终的消息执行
messageQueue - 消息队列,消息的储存单位
Looper - 遍历 MessageQueue 队列,启动主线程的阻塞式死循环
message - 通信的消息实体,使用 handle 发送消息时,其内部的 obj 会被指向该 handle 的引用
再说下逻辑过程:
开启循环 - 每个线程只有一个Looper,用来阻塞式循环,每个Looper对应一个MessgeQueue;无限的循环遍历MessageQueue,如果里边有消息就去处理消息,消息处理完继续循环,这样就一直循环下去,也是我们程序为什么不会退出的原因
发送消息 - handler创建的时候会根据线程去绑定,拿到对应线程的队列looper和MessageQueue,发送消息的过程就是在其他线程把Message放到MessageQueue当中
回调消息 - handler发送消息的时候会对Message消息打上tag,当looper遍历到Message对象,这个时候已经到了主线程,Message.tag就拿到了handler对象,然后回调对应的方法handler.handleMessage
handler.handleMessage(msg)
handler.post(Runnable r)
view.post(Runnable r)
Activity的 runOnUiThread(Runnable r)
CyclicBarrier的某个线程运行到某个点上之后,该线程即停止运行,直到所有的线程都到达了这个点,所有线程才重新运行,CountDownLatch则不是,某线程运行到某个点上之后,只是给某个数值-1而已,该线程继续运行
CyclicBarrier只能唤起一个任务,CountDownLatch可以唤起多个任务
CyclicBarrier可重用,CountDownLatch不可重用,计数值为0该CountDownLatch就不可再用了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。