Android之多线程开发

线程(Thread)相关概念

        进程(Process)
        同一个操作系统中执行的子程序,包含虚拟CPU、代码、数据三部分。进程一般指一个执行单元,在PC和移动设备上指一个程序或一个应用。一个进程可以包含多个线程,进程跟线程可以理解为包含与被包含的关系。

        线程(Thread)
        同一进程中执行的子程序,Java语言的概念,实际执行任务的基本单元,Android异步处理技术的基础。
        线程是CPU调度的最小单元,是一种有限的系统资源。通常情况下进程中会存在大量耗时任务,如果这些任务在UI线程中进行会造成异常,所以解决这个问题就需要把耗时任务放到子线程中处理。

        多线程
        同一进程中并发执行的多个子程序流,可以提高CPU的使用率;

        多线程的作用
        多线程可以发挥多核CPU的优势、防止阻塞、便于建模;


Android中常见线程

        主线程(UI线程)
        主线程又叫做UI线程,随着应用启动而启动,用来运行Android组件,刷新屏幕上的UI元素。只有主线程才能操作UI,因为Android UI工具包不是线程安全的。
        主线程负责的内容包括UI生命周期控制、系统事件处理、消息处理、界面布局、界面绘制、界面刷新。除此之外,尽量避免将其他处理放在主线程中,特别是复杂的数据计算和网络请求等。

        子线程
        子线程也叫工作线程,除了主线程之外都是子线程;

        Binder线程
        Binder线程用于不同进程之间线程的通信,每个进程都维护了一个线程池用来处理其他进程中线程发送的消息,这些进程包括系统服务、Intents、ContentProvider和Service等;

        后台线程
        在应用中显式创建的线程都是后台线程。刚创建出来时这些线程的执行是空的,需要手动添加任务;
        Linux系统层面,主线程和后台线程一样。在Android框架中,通过WindowManager赋予了主线程只能处理UI更新以及后台线程不能直接操作UI的线程。


实现Thread的方式

        实现线程一般我们有两种方式,第一种是继承Thread类,第二种是实现Runnable接口。
        java.lang.Thread类的实例就是一个线程,它需要调用java.lang.Runnable接口来执行,线程类本身就是调用Runnable接口,所以实现线程既可以继承java.lang.Thread类也可以实现Runnable接口来重写run()方法。
        实际上Thread也算是一个Runnable,它内部实现了Runnable接口,在Thread类中有一个Runnable类型的target字段,代表要被执行在这个子线程中的任务。Thread只是对Runnable的封装,并且通过一些状态对Thread进行管理与调度。
        当启动一个Thread的时候如果Thread的target不为空,则会在子线程中执行这个target的run()函数,否则虚拟机就会执行该线程自身的run()函数。
        两种创建方式工作时性质是一样的,建议使用实现Runnable接口方式可以避免单继承的局限性。

//继承Thread类
private class SyncThread extends Thread {
        SyncThread(String name) {
            super(name);
        }
        
        @Override
        public void run() {
           //执行耗时操作
        }
}

//实现Runnable接口
//Runnable接口定义了可执行的任务,只有一个无返回值的run()函数
private class SyncRunnable implements Runnable {    
        @Override
        public void run() {
            //执行耗时操作
        }        
}



线程相关重要方法

        wait()
        当线程执行到wait()方法的时候它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁,使得其他线程可以访问。用户可以使用notify()、notifyAll()或指定睡眠时间来唤醒当前等待池中的线程。
        wait()、notify()通常用于等待机制的实现,当条件未满足的时候调用wait()进入等待状态,一旦条件满足调用notify()或notifyAll()唤醒等待的线程继续执行。
        wait()、notify()、notifyAll()必须放在synchronized block中,否则报错。

        join()
        阻塞当前调用join()函数所在的线程,直到接收线程执行完毕后再继续。等待目标线程执行完成之后再继续执行,目标线程未执行完之前,加入线程无法进行操作。

        yield()
        线程礼让,也叫做线程让步。目标线程由运行状态转换为就绪状态,让出执行权限让其他线程先执行,其他线程能否优先执行是未知的。
        yield()与join()类似,为使调用该方法的线程让出执行时间给其他已就绪状态的线程。线程的执行是有时间片的,每个线程轮流占用CPU固定的时间,执行周期到了之后就让出执行权给其他的线程。yield()的功能就是主动让出线程的执行权交由其他线程,其他线程能否得到优先执行就看各个线程的状态。

        sleep(long milis)
        在指定毫秒数内让当前正在执行的线程休眠(暂停执行),本线程不会去抢,除非sleep()结束,多个线程之间都会去抢执行权限,不会考虑优先级;

        currentThread()
        返回对当前正在执行的线程对象的引用(实现接口方式时使用);

        setDaemon(boolean on)
        将该线程标记为守护线程,守护线程需要依赖其他线程,会在虚拟机停止的时候停止。一个线程守护另一个线程,守护的线程称为守护线程,被守护的线程称为非守护线程,作用是为其他线程运行提供便利服务。


线程安全

        如果代码在多线程下执行和在单线程下执行永远都能获得一样的结果,代码就是线程安全的。
        为了保证数据在多线程操作中的一致性我们需要通过同步锁保证在同一时刻只有一个线程能够访问到该对象或数据,对它进行修改后再将最新数据同步,使得其他线程能够得到这个最新的数据。

        Synchronized
        Synchronized是一个Java关键字,是最常用的同步机制,是一种基于语言的粗略锁,能够作用于对象、函数、类。每个对象都只有一个锁,谁能够拿到这个锁谁就能得到访问权限。

        synchronized作用于类时锁的是这个类,不是具体的对象;

        synchronized作用于函数,实际上锁的也是对象,锁定的对象就是该函数所在类的对象;

        synchronized作用于对象的时候是防止其他线程访问同一个对象synchronized代码块或函数。


停止线程

  1. 使用退出标志,使线程正常的执行完run()方法终止;
  2. 使用interrupt方法使线程异常,线程进行捕获或抛异常,正常执行完run方法终止;
  3. 使用stop()方法强制退出;


线程优先级

        线程优先级范围为1-10,API提供等级分为:低(MIN_PRIORITY=1),中(NORM_PRIORITY=5),高(MAX_PRIORITY=10)
        线程优先级特点

  1. 继承特性(线程A中启动线程B,线程B继承了A的优先级);
  2. 随机性(线程调度的顺序不一定是根据优先级,具有随机性);
public class ThreadPriorityDemo {
    public static void main(String[] args) {
        Thread thread = new ThreadPriority("thread_1<<<<");
        Thread thread_1 = new ThreadPriority(">>>thread_2");
        thread_1.setPriority(Thread.MIN_PRIORITY); //<设置线程优先级
        thread.setPriority(Thread.MAX_PRIORITY);
        thread_1.start();
        thread.start();
    }
}

class ThreadPriority extends Thread {
    public ThreadPriority(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("" + Thread.currentThread().getName() + ",number:" + i + ",Priority:" + Thread.currentThread().getPriority());
        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值