Android 关于线程创建

来源:互联网 发布:淘宝的hottoys有假货吗 编辑:程序博客网 时间:2024/06/05 04:12

创建线程的几种方法

Java提供了线程类Thread来创建多线程的程序。其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。每个Thread对象描述了一个单独的线程。要产生一个线程,有两种方法:

◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法;
◆实现Runnalbe接口,重载Runnalbe接口中的run()方法。

Thread类代表线程类,它的两个最主要的方法是:
run()——包含线程运行时所执行的代码
Start()——用于启动线程

一、继承Thread类创建线程类

(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。

(2)创建Thread子类的实例,即创建了线程对象。

(3)调用线程对象的start()方法来启动该线程。

二、通过Runnable接口创建线程类

(1)定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。

(2)创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

(3)调用线程对象的start()方法来启动该线程。

三、通过Callable和Future创建线程

(1)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。

(2)创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。

(3)使用FutureTask对象作为Thread对象的target创建并启动新线程。

(4)调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

创建线程的三种方式的对比:

采用实现Runnable、Callable接口的方式创见多线程时,优势是:

线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。

在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。

劣势是:

编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法。

 

使用继承Thread类的方式创建多线程时优势是:

编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。

劣势是:

线程类已经继承了Thread类,所以不能再继承其他父类。

 

匿名内部类(Anonymous Inner Class),在创建实例的同时给出类的定义,所有这些在一个表达式中完成。

 
 
 
 
private Thread xxx;
 
Runnable xx = new Runnable() {
    public void run() {
具体操作
    }
};
 
 
创建线程: xxx=new Thread(xx);
              xxx.start();

相当于:

class Anomymous implements Runnable {
    public void run() {
    }
}
Runnable rn = new Anomymous();

可以看到前者更简洁。(注意前者最后的分号不能省略,编译器把整个看作一条语句)
不过,匿名内部类仅限于只实例化一次的内部类,如果内部类需要多次实例化,通常用后者。
另外,匿名内部类要么继承一个父类,要么实现一个接口,不能两者兼有,实现接口时也不能实现多个接口。

匿名内部类即可以扩展类,也可以实现接口,但是不能两者兼备。而且如果是实现接口,也只能实现一个接口。

假如不是匿名类,而是一个普通类,我们是不是可以这样写:

 class Universal extends FatherClass implements Interface1,Interface2 { }
普通类Universal 继承于类FatherClass ,同时又实现了Interface1与Interface2接口。(实现了两个接口)
而对于一个匿名类,就不能象上面的Universal既有继承,又有实现。且如果是实现只能是实现一个接口。


快速创建线程的方法:

 第一种:直接创建子线程并启动

   private Thread newThread;         //声明一个子线程
   new Thread() {
@Override
public void run() {
     //这里写入子线程需要做的工作
        }
   }.start();
  
第二种:先创建子线程,然后启动
        private Thread newThread; //声明一个子线程
newThread = new Thread(new Runnable() {
    @Override
            public void run() {
            //这里写入子线程需要做的工作
            }
        });
    newThread.start(); //启动线程

0 0
原创粉丝点击