线程:继承Object
APP -> 进程 -> 多线程
主线程+子线程
主线程耗时超过5s将会报错ANR;耗时操作:网络请求、数据库操作、图片编辑
1.子线程:(handle,Message,MessageQueue,looper)
1.1.创建( 熟练掌握)
(1).直接继承thread,重写run方法。
Thread(new Runable(){
@override
void run (){
}
})
(2).实现runable方法,传给Thread。
new Thread()
**注意**
Thread参数(ThreadGourp,Runnable target,name,AccessControlContext acc)
init(ThreadGourp,Runnable target,String name,long stackSize,AccessControlContext acc)
if (name == null) {throw new NullPointerException("name cannot be null");}//name一般为系统分配
parent = currentThread()
group , runable,daemon,priority 可以使用parent的
**新建的线程必须执行 thread.start()方法才会开始执行。
*thread.start被synchronized所修饰
*Thread类本身只实现runable接口
1.2.线程的状态
*初始状态(NEW) new Thread
*可运行状态(RUNABLE) start执行进入就绪状态 执行run方法,表示正在执行或者可以执行状态。
*等待状态(WAITING)
*阻塞状态(BLOCKED) 阻塞状态
*等待特定时间(TIMED_WAITING)
*结束状态(TERMINATED) 执行run方法完毕,或遇到异常退出
**
线程结束之后,线程销毁,只能新建无法返回销毁之前的状态和数据
1.3.各种方法(start,join……)
具体线程的方法:
start(): 开始启动
run(): 执行run函数
join(): 让目标线程加入到当前的线程中执行,当前线程进入WAITING状态
wait(): 如果要让某个线程进入wait状态,必须对该线程设置 Synchronized(Object):同步锁
使线程进入WAITING状态
如果设置具体等待时间,线程进入TIMED_WAITING状态
notify(): 用于唤醒处于Wait状态下的对象
和wait相对应,都需要设置 Synchronized同步锁,
***不加同步锁的话,程序会出现异常
Thread方法:
sleep()
1.4.主线程交互( 熟练掌握)
1.4.1:Handle+message
1.4.2:runOnUiThread(runable)
1.4.3:handle.post
1.5.线程停止( 了解)
1.5.1.volatile关键字:
其他线程可见
3.Synchronized(Object):同步锁
4.AsyncTask:(对Thread的封装) ***API level 30中被弃用
异步任务:封装好的线程池,但是最多同时运行5个此类的线程。
创建时需要定义三个继承自Object的参数:O1,O2,O3
TasK内有四个主要的方法步骤需要执行:(按照执行逻辑)
(1).protected void onPreExecute()
做TASK的开始准备
(2).protected 返回第三个参数 doInBackground(传入第一个参数)
主要的执行逻辑代码
publishProgress(第二个参数) 这个方法会通知第三步执行
return 之后通知第四个步骤进行执行
(3).protected void onProgressUpdate(第二个参数)
做出视图更新
(4).protected void onPostExecute(第三个参数)
任务完成的操作