简单实例化解析安卓Thread线程

来源:互联网 发布:手机噪音检测软件 编辑:程序博客网 时间:2024/05/24 07:09

进程(Process)与线程(Thread)

进程是某个正在执行的应用程序的执行过程,该过程包括应用程序在执行之前向操作系统(OS)申请系统资源、开始执行、整个执行过程、执行结束。

从用户体验的角度上来说,若干个进程是处于“同时执行”的状态的,事实上并不是这样!操作系统会实现CPU的调度,使得CPU在多个进程之间高频率的切换,由于切换速度快,所以,从正常的视觉和听觉等感观是无法察觉的,即体验到的就是“同时执行”!

操作在调度CPU为各个进程运算时,一定程度上是随机的,即每个进程运算多长时间是随机的,但是,该时间不会出现特别大的跨度,导致始终运算某个程序,或始终不运算某个程序!

以上描述的进程的特性,本质上是线程的特性,每个进程中,默认都会存在1个线程,真正负责执行的是线程,而进程只是若干个线程的容器。

每个进程中,默认都会存在1个线程,这样的线程称之“主线程”,而其它的由开发者创建并启动的线程称之为“子线程”,或“工作线程”,当某个程序需要同时执行多项任务时,可以使用子线程!

主线程与子线程一样,都是程序的执行流程,程序并不会因为主线程执行完毕而直接结束,只要进程中存在任何一个线程还处于运行状态,该进程就不会被销毁!

创建并启动线程

  • [方式一] 自定义类CustomThread,继承自java.lang.Thread,并重写public void run()方法,在该方法中编写需要执行的任务,然后,再创建CustomThread类的对象,当需要启动线程时,调用该对象的start()方法即可!
  • [方式二] 自定义类CustomRunner,实现java.lang.Runnable接口,并重写public void run()方法,在该方法中编写需要执行的任务,然后,再创建CustomRunner类的对象,再创建Thread类的对象,并将CustomRunner对象作为创建Thread类的对象的构造方法的参数,最后,调用Thread类的对象的start()方法即可!

Thread的常用方法

  • void setName(String name) -> 设置线程的名称,主要用于调试
  • String getName() -> 获取线程的名称,主要用于调试
  • long getId() -> 获取线程的ID,主要用于调试,每个线程的ID都是唯一的,其中,主线程的ID值一定是1
  • static Thread currentThread() -> 获取当前线程的线程对象
  • static void sleep(long millis) -> 设置线程在接下来的millis时间内休眠,即不工作,参数是以毫秒为单位的数值,1秒=1000毫秒
  • void start() -> 开启线程
    下面提供一个实例详解安卓中的thread的应用;
    首先创建一个简单的安卓项目:
    如图,只需要3个view,一个按钮,一个textview,一个progress bar;
    这里写图片描述
    回到mainactivity的代码及其详细解析如下:
    package cn.tedu.progressbar;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends Activity implements View.OnClickListener {

//新建的类实现view的onclick接口

private ProgressBar pbProgress;//声明一个进度条private TextView tvProgress;//声明一个文本控件,这个对应的是进度条下显示进度的文本框。private View btnStart;//声明一个按钮@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    pbProgress = (ProgressBar) findViewById(R.id.pb_progress);//找到相关的控件    tvProgress = (TextView) findViewById(R.id.tv_progress);    btnStart = findViewById(R.id.btn_start);    btnStart.setOnClickListener(this);//设置监听器}@Overridepublic void onClick(View v) {//实现监听器的点击事件    InnerThread thread = new InnerThread();//创建一个继承thread的innerthread的对象;    thread.start();//启动线程;    btnStart.setEnabled(false);//将按钮设置为不可用;意即onclick事件运行期间不可点击按钮;}private class InnerThread extends Thread {//自定义thread的子类    private int i;//声明一个int i;    @Override    public void run() {//重写thread的run方法

// 新建一个Runnable对象runner,并需要重写runnable中的run方法;

        Runnable runner = new Runnable() {//通过匿名内部类直接重写run方法            @Override            public void run() {                pbProgress.setProgress(i);//将进度条设置到i位置;                //textview中显示的是当前进度和总进度。例如:20/100;max在进度条属性中设置为100;                tvProgress.setText(pbProgress.getProgress() + " / " + pbProgress.getMax());            }        };

// runner对象完成;

        for (i = 1; i <= 100; i++) {            runOnUiThread(runner);//将runner投射到ui里;            try {                Thread.sleep(10000 / 100);//进度条每跳动一下睡眠100ms            } catch (InterruptedException e) {                e.printStackTrace();            }        }

// 运行完后需要将按钮设置为可点击状态;再新建一个Runnable内部类完成对按钮的设置;

        runOnUiThread(new Runnable() {            @Override            public void run() {                btnStart.setEnabled(true);            }        });    }}

}

1 0