android基础:线程介绍和使用

1.线程

(1):什么是线程:

线程(thread)是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是线程中的实际运作单位。(摘自百度)

(2):为什么要使用多线程:

假设同一个任务,如果是一个人去做,或者,将任务分割成几块,让几个人分别去完成单块任务,那么是不是后者要更加

节省时间?如果让多个人去联合起来完成任务,每个人分工,就相当于使用“多线程”,使得效率更高

当然,这只是个比方,在android开发中,使用多线程的好处有:

1.提高用户的体验,避免ANR(application is not responding)。(ANR:程序未响应而弹出警告)

2.在android中,事件处理的原则是:将所有可能耗时的操作放在其他线程中进行处理,主线程中不能进行进行耗时操作

3.在处理关于网络事件,尤其是从网上下载东西时,使用多线程下载效率更高

(3):如何开启一个线程:

和java的语法一致,可以采用继承Thread类或者使用Runnable接口进行创建新的线程

part1:使用Runnable接口


public class MyRunnable implements Runnable {
    //当对象已经继承了别的类 无法继承Thread时,可以采用 使用Runnable方法同时复写Run方法进行实现
    @Override
    public void run() {
        Log.d("TAG_Runnable",Thread.currentThread().getName()+".run()");//打印当前线程名
    }
}

//使用线程
 public void textRunnable(){
        /**
         * 使用Runnable方法进行线程的加载时,声明了两个目标对象,然后装载到Thread中
         * */
        MyRunnable mr1=new MyRunnable();
        MyRunnable mr2=new MyRunnable();
        //多个Thread对象可以传递同一个mr
        //线程同步
        Thread t1=new Thread(mr1);
        Thread t2=new Thread(mr2);

        t1.start();
        t2.start();
    }

 

part2:继承Thread类


/**
 * 通过继承Thread类实现多线程,类内部复写run方法实现相应操作 然后调用时通过start方法进行拉起
 * */
public class MyThread extends Thread {
    //创建子线程 复写run方法
    @Override
    public void run() {
        Log.d("TAG_Thread",Thread.currentThread().getName()+".run()");//打印当前线程名
    }
}
 public void textThread(){
        //创建两个子线程
        MyThread mt1=new MyThread();
        MyThread mt2=new MyThread();
        //将线程跑起来
        mt1.start();
        mt2.start();
    }

既然可以使用两种方法开启线程,那么上述两种方法有什么区别呢?

1.如果存在一个类,已经继承了别的类,就无法再去继承Thread类了,走这种方法就无法开启新的线程,但是,一个类是可以使用一个或者多个接口,这样,偏向于使用Runnable接口

2.如果翻看源码,Thread同样继承自Object类,而在Object类中已经使用了Runnable接口,所以偏向于使用接口的方法来开启一个新的线程

 

线程的同步锁:synchronized

多个线程是可以操作同一个对象的,但是,要注意线程的同步问题

以一个经典的问题:火车站卖票来说明(一个火车站有多个站点,实现同时卖票)

思路:采用多线程的方法模拟多个卖票窗口,操作同一个对象(总票数)

public class SaleTicket implements Runnable {
    private int ticketNum = 20;

    //如果涉及多个Thread操作同一个对象的时候 需要加上线程同步锁
    @Override
    public void run() {
        while (true) {
            //线程同步锁
            synchronized (this) {
                if (ticketNum > 0) {
                    Log.d("TAG", Thread.currentThread().getName() + "卖出了第" + (20 - ticketNum + 1) + "张票");
                    ticketNum--;
                }
                //火车票已经售完
                else {
                    Log.d("TAG", "票已售完");
                    break;
                }
            }
            //卖一张票休息200ms,
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
}
//实现卖票功能
public void textSale(){
        SaleTicket saleTicket=new SaleTicket();
        //多个线程操作同一个对象,加同步锁
        //线程的级别一致
        Thread t1=new Thread(saleTicket,"A代理");
        Thread t2=new Thread(saleTicket,"B代理");
        Thread t3=new Thread(saleTicket,"C代理");
        Thread t4=new Thread(saleTicket,"D代理");

        t1.start();
        t2.start();
        t3.start();
        t4.start();

    }

2.在android中如何开启多个线程

2-1:使用匿名类进行线程的使用

 

 new Thread(new Runnable() {
            @Override
            public void run() {
                //TODO
            }
        });
    

 一般来说直接使用匿名类创建新线程即可,但是这样做会存在着一些弊端:

* a.每次new Thread新建对象的性能差
* b.线程缺乏统一管理,可能无限制新建线程,相互之间进行竞争,或者可能占用过多的系统资源导致死机或者内存溢出
* c.缺乏更多功能 如定时执行 定期执行 线程中断

所以在android中引入了线程池这一概念,使用线程池可以很好的管理线程,并且,可以给它们更多的

附加功能(定时,定周期执行)(具体使用方法见后文:android线程池的使用)

注:上述为主要实现代码,可以自行装填入配合控件触发进行操作,本人安卓学习刚起步,
希望各位大佬可以给出自己的意见和建议,谢谢大家!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值