您的位置:首页 > 移动开发 > Android开发

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

2016-11-09 23:02 239 查看
进程(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);
}
});
}
}


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线程 android Thread