什么是线程?
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。如何使用多线程
1.AsyncTask异步多线程
AsyncTask的规范型很强,能够时时反映更新的情况
它一般有这么几个方法
onPreExecute(), 该方法将在执行实际的后台操作前被UI 线程调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现。
doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台处理工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
onProgressUpdate(Progress...),在publishProgress方法被调用后,UI 线程将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI 线程调用,后台的计算结果将通过该方法传递到UI 线程,并且在界面上展示给用户.
class TestTask extends AsyncTask<Integer,Integer,String>{
@Override
protected void onPreExecute() {
// main thread ,before doInBackground();
mTextView.setText("加载中");
super.onPreExecute();
}
@Override
protected String doInBackground(Integer... params) {
// worker thread
// download parse xml data
return String.valueOf(params[0] * 2 + 2);
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
// main thread ,after doInBackground();
mTextView.setText("加载完成, 结果是:" + result);
}
}
}
2.Actiavity.run.runOnUiThread(new Runnable()
new Thread(new Runnable() { // work 线程
@Override
public void run() {
// 第一种
runOnUiThread(new Runnable() {
@Override
public void run() {
mTextView.setText("我在其它线程中千辛万苦来看你……"); }
});
3.View.post(new Runnable)
mTextView.post(new Runnable() {
@Override
public void run() {
mTextView.setText("我在其它线程中千辛万苦来看你……");
}
}) ;
4.View.postDelayed(Runnable,long)
mTextView.postDelayed(new Runnable() {
@Override
public void run() {
mTextView.setText("我在其它线程中千辛万苦来看你……");
}
},1000);
5.Handler 机制,它是Runnable和Activity交互的桥梁,在run方法中发送Message,在Handler里,通过不同的Message执行不同的任务。
(Handler的设计实际上是为了应用程序内其他线程和主线程进行通信,因为只有主线程才能更新UI,其他线程不行)