线程是程序最小的调度单位,在同一进程中的资源是共享的,可以理解为:多线程可以同享同一个变量,但是需要注意线程安全问题,小心会产生售票问题
弊端:创建大量线程容易消耗完系统内存以及导致cpu的频繁切换造成系统死机
实现线程的方法:
一、一种是类继承Thread
二、一种是实现接口Runnable
Thread调用方法:
Thread thread=new Thread();
1、thread.run();
2、thread.start();
run()只是调用了Thread实例的run()方法而已,需要等到run方法体中的任务执行完之后,才会执行后面的代码,还是运行在主线程中
start()无需等待run方法体中的任务结束,再执行后面的代码,会开辟一个新的线程,此时run()才会运行在新的线程中。
三、一种实现接口Callable
第一、二方式都是在任务结束后无法获取结果,所以在java1.5以后,提供了Callable和Future,可以获取执行结果。
四、AsyncTask参数含义以及重要方法
AsyncTask<Params,Progress,Result>参数含义:Params:传入参数,Progress:任务执行进度,Result返回结果。
asyncTask即支持串行也支持并行,串行方法execute()、并行方法executeOnExecutor()
onPreExecute()在主线程中执行,做准备工作
doInbackground(Params...params)子线程在后台执行任务
onProgressUpdate(Progress value)在子线程中执行任务,更新UI
onPostExecute(Result result)在主线程中执行,返回doInbackground()的值
简单使用:继承AsyncTask
并行执行:
串行执行:
五、取消
在AysncTask中,是没有办法直接取消执行中的任务的,只能把AsyncTask的标记状态改成cancel状态,未执行的任务是可以直接取消的,那么怎么取消正在执行的任务呢?既然我们的任务都是在doInBackground(String... params)执行的,那么我们就需要在这里处理了。
使用场景1:
在页面不可见或者退出时调用myAsyncTask.cancel(true),然后在doInBackground(String... params)中通过if (isCancelled()){break;}
代码如下: