在Android 中 有两种方法可以实现多线程操作,一种是Runable,另外一种是Thread.
他们的不同点:
Runable是一个接口,可以避免只能继承一个父类的限制,可以实现数据共享。但是如果想要多个线程实现自己的功能,则需要用到Thread.
Thread是一个类,他实现了Runable接口。
他们占用CPU以及是否开新线程的解释:
Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。
而Runnable是一个接口,Thread是Runnable的子类。所以说,他俩都算一个进程。
HandlerThread顾名思义就是可以处理消息循环的线程,他是一个拥有Looper的线程,可以处理消息循环。
与其说Handler和一个线程绑定,不如说Handler是和Looper一一对应的。
最后需要说明的是,在UI线程(主线程)中:
mHandler=new Handler();
mHandler.post(new Runnable(){
void run(){
//执行代码...
}
});
这个线程其实是在UI线程之内运行的,并没有新建线程。
常见的新建线程的方法是:
Thread thread = new Thread();
thread.start();
HandlerThread thread = new HandlerThread("string");
thread.start();
关于数据共享:
- package org.demo.runnable;
- class MyThread implements Runnable{
- private int ticket=10;
- public void run(){
- for(int i=0;i<20;i++){
- if(this.ticket>0){
- System.out.println("卖票:ticket"+this.ticket--);
- }
- }
- }
- }
- package org.demo.runnable;
- public class RunnableTicket {
- public static void main(String[] args) {
- MyThread mt=new MyThread();
- new Thread(mt).start();//同一个mt,但是在Thread中就不可以,如果用同一
- new Thread(mt).start();//个实例化对象mt,就会出现异常
- new Thread(mt).start();
- }
- };
这样的话,只会显示10个数字,三个Thread共享同一个Runable的属性"ticket",虽然每个线程中,仍然会循环20次,但是他们共用的属性"ticket"只会显示十次。