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

本文介绍了进程与线程的基本概念,强调了线程是执行的真正实体,主线程与子线程的关系,以及如何在Android中创建并启动线程。提供了两种创建线程的方式,一种是继承Thread类,另一种是实现Runnable接口。此外,还讲解了Thread的常用方法,如设置和获取线程名、获取线程ID和休眠。最后,通过一个简单的Android项目实例,展示了线程在实际应用中的使用。
摘要由CSDN通过智能技术生成

进程(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;//声明一个按钮

@Override
protected 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);//设置监听器
}

@Override
public 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);
            }
        });
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值