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线程池的使用)
注:上述为主要实现代码,可以自行装填入配合控件触发进行操作,本人安卓学习刚起步,
希望各位大佬可以给出自己的意见和建议,谢谢大家!