Android多线程编程(一)- 线程基础

Android多线程编程(一)

到了学习下一部分了,多线程编程一直都是Android经常使用的部份,在进行网络请求或者访问数据库时,为了避免主线程被耗时操作阻塞了进度,通常都会开启子线程进行处理,多线程编程在Android属于相当重要的一部分,接下来的阶段我会开始学习多线程编程,并且把学习笔记记录在这里。

我们通常会看到AS抛出的异常,告诉我们**操作不能在主线程中进行,或者说更新UI的操作必须在UI线程中进行,这个所谓的主线程和UI线程其实是同一个,Android应用在创建的时候就会自动的开启一个线程,这个线程就是我们说的主线程或者UI线程。下面开始我们正式开始学习线程知识:

线程基础

进程,线程

说到线程不得不先说一下进程,这两个我们从很早之前就听过了,它们之间的区别以及联系想来都已经了解过一部分了,不过还是一步步说一下吧:

进程

进程是一个操作系统的结构基础,可以看成是线程的容器,是程序在一个数据集合上运行的过程,是程序进行资源调度以及资源分配的基本单位,我们可以理解为,一个程序就是一个进程,比如手机上的QQ,微信,这都是一个进程。

线程

线程是操作系统可以操作调度的最小单元,进程是线程的容器,线程也就是进程的组成部分,我们可以理解线程为实现程序的各个组成部分,比如QQ,这是一个进程,他其中的线程有的负责网络连接,有的负责文件下载,这就是线程。这些线程各自有各自的作用,也就有各自独立的变量,数据结构·,链表,堆栈等,不过他们都可以访问这个进程的共享变量。

多进程

虽然我们写的是多线程操作,但是操作系统中也是有多进程的,先来看一下多进程的优点:

1.目前的计算机都是多核CPU,多个任务可以并行执行,那么多进程也就是多个任务同时执行,会提高CPU的使用效率;

2.目前为止,计算机提高程序性能的唯一办法,就是多核以及并行程序;

当然多进程也是会有缺点的,多个进程之间通讯比较繁琐,而且不容易切换,如果一个程序的每个功能都做成一个进程的话,计算机或者说手机,使用起来会极其不方便。

多线程

与进程相比,线程创建和切换的代价会小很多,同时多线程可以进行信息共享,大大提高了数据共享方面的效率,除了和线程相对比的好处之外,他的优点不仅在此:

1.多线程可以减少程序响应时间,例如网络请求,如果当前网络质量不佳,这个时候就会耗费很长时间来进行处理,这个时候你的程序就会进行等待,直到网络处理完成,才能进行其他操作,而开启多线程则可以把这个请求放置在一个单独的线程中去,程序依然可以进行其他操作;

2.在使用多线程的时候,我们的程序结构会得到简化,在理解程序以及维护程序的时候效率会大大加强。

六种线程状态

线程在运行的时候存在这周期,周期中存在六种不同的状态,我们来了解一下这六种状态:

1.New状态:线程处于刚被创建状态,还没进行start方法,在start之前还有一些准备工作要做;

2.Runnable状态:线程处于可运行装状态,在线程调用了start方法后,就会处于这个Runnable状态,这种状态下的线程可能正在运行,也可能没有运行,取决于操作系统给线程提供的运行时间;

3.Blocked状态:线程处于阻塞状态,表示线程被锁给阻塞了,这个时候线程不运行;

4.Waiting状态:线程处于等待状态,这个时候线程什么都不做,就是等,直到线程调度器激活它;

5.Timed waiting状态:线程处于超时等待状态,和上面基本类似,不过不同的是设置了时间,在指定的时间自动返回;

6.Terminated状态:线程处于终止状态,表示当前线程执行完毕,出现这种状态有两种情况,一种是run()方法执行完毕正常退出,另外一种就是有异常,直接终止了run()方法,从而线程直接终止。

总结来说这几个状态的执行顺序以及执行条件就是:

线程在创建之后进入New状态,在执行start()后进入Runnable状态,这个时候不确定是否在运行,随后如果执行了wait方法后,就会进入Waiting状态,进入等待状态的线程需要其他线程通知它才会返回运行状态,而超时等待则更高一筹,他给自己设置了时间,时间一到就自己返回运行状态,当这个线程没有获得锁的话,也就是无法运行,进入到Blocked状态,获得锁后会重新进入运行状态,在所有任务执行完毕或者捕获到异常状态的时候,线程会终止,也就是进入到Terminated状态。

线程的创建

经过了这么多的基础知识储备,我们进入到使用线程这部分,使用线程之前自然要先进行线程的创建,线程的话,一共有三种创建方式,我们来了解一下,当然最重要的,也就是我们需要着重掌握的就是前两种:

一:通过Thread进行创建

我们之前多多少少也接触过一些线程的知识,这里就没用的话不多说了,写一部分重要内容,然后就是具体实现部分:

通过Thread进行创建其实也就是继承Thread父类,而Thread本质上来说也是一个实现了Runnable的实例,具体执行代码:

public class TestThread extends Thread{
    public void run() {
        // 用于处理耗时逻辑
    }
}

就这样我们的线程就已经创建好了,不过这个时候也就是之前说过的处于状态NEW,需要调用start方法才能进入可运行状态在需要的地方创建实例:

TestThread testThread = new TestThread();
testThread.start();

这样就可以了,可以执行TestThread中的run()中的操作了。

二:通过Runnable接口进行创建

和上面的类似,不过这次我们是实现Runnable接口,相比于继承父类,实现接口更为的方便和可操作,因为Java是单根继承的特性,因此一般我们都会选择第二种的方法:

private class TestThread implements Runnable{
        public void run(){
            // 用于处理耗时逻辑
        }
    }

和之前一样,就只是更改了实现接口这个部份,在进入可运行状态时,还是需要Thread的start()方法:

new Thread(new TestThread()).start();

就这样,不过这种看起来就很麻烦,我们通常在安卓中会采用匿名内部类的方法:

 new Thread(new Runnable() {
            @Override
            public void run() {
            	// 用于处理耗时逻辑
            }
        }).start();

一目了然。

就这么多吧,下一篇开始写线程的同步问题以及异步问题,也就是避免死锁,handler传递消息等知识。

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值