黑马程序员技术交流社区

标题: 创建线程的几种方式? [打印本页]

作者: 左华清    时间: 2012-2-18 22:41
标题: 创建线程的几种方式?
本帖最后由 左华清 于 2012-2-19 12:59 编辑

直接继承Thread实现,或是引用接口Runable.

运用内部类实现接口创建? 不太明白,求代码?
作者: 成果    时间: 2012-2-18 22:59
创建线程有两种方式:使用Runnable接口和继承Thread类。使用Runnable接口的实现类来提供线程体,这是创建线程的基本方式。还可以采用直接继承Thread类、重写其中的run()方法并以之作为线程体的方式创建线程,
两种创建线程方式的有两方面的区别。
l     使用Runnable接口创建线程时可以将CPU,代码和数据分开,形成清晰的模型。线程体run()方法所在的类还可以从其他类继承一些有用的属性或方法,并有利于保持程序风格的一致性。
l     直接继承Thread类创建线程时,Thread子类无法再从其他类继承。但这种情况编写简单,run()方法的当前对象就是线程对象,可直接操纵。
至于类部内就new thread(){run方法}
作者: 吴文华    时间: 2012-2-18 23:21
本帖最后由 吴文华 于 2012-2-18 23:22 编辑

在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。Thread类的构造方法被重载了八次,构造方法如下:

   public Thread( );
  public Thread(Runnable target);
  public Thread(String name);
  public Thread(Runnable target, String name);
  public Thread(ThreadGroup group, Runnable target);
  public Thread(ThreadGroup group, String name);
  public Thread(ThreadGroup group, Runnable target, String name);
  public Thread(ThreadGroup group, Runnable target, String name, long stackSize);
  Runnable target
  实现了Runnable接口的类的实例。要注意的是Thread类也实现了Runnable接口,因此,从Thread类继承的类的实例也可以作为target传入这个构造方法。

    一个普通的Java类只要从Thread类继承,就可以成为一个线程类。并可通过Thread类的start方法来执行线程代码。虽然Thread类的子类可以直接实例化,但在子类中必须要覆盖Thread类的run方法才能真正运行线程的代码。下面的代码给出了一个使用Thread类建立线程的例子:

    001 package mythread;
  002
  003 public class Thread1 extends Thread
  004 {
  005 public void run()
  006 {
  007 System.out.println(this.getName());
  008 }
  009 public static void main(String[] args)
  010 {
  011 System.out.println(Thread.currentThread().getName());
  012 Thread1 thread1 = new Thread1();
  013 Thread1 thread2 = new Thread1 ();
  014 thread1.start();
  015 thread2.start();
  016 }
  017 }
  上面的代码建立了两个线程:thread1和thread2.
作者: 何招俊    时间: 2012-2-18 23:51
线程在JAVA中使用Thread来表示。最基本的产生线程的方法是new Thread();然后调用它的start()方法。
一般实现线程的方法有两种:
1,继承Thread类,并重写run()方法。例如:匿名类实现
       Thread thread = new Thread(){
            public void run(){
                System.out.println(Thread.currentThread().getName());
            }
        };
        thread.start();
2,实现Runnable接口,重写run()方法,并作为参数传给Thread()的构造函数。例如:匿名类实现
        Thread thread = new Thread(new Runnable(){
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName());
            }});
3,在使用面向对象思想编程时,一般都会使用第二种方法。并且在JAVA这种单一继承体制下,实现接口显得更加灵活。

作者: 彭坤    时间: 2012-2-19 09:26
楼上的几位没有理解楼主要问的问题:为什么要使用内部类创建线程?
要想搞清楚这个问题,首先必须弄清楚,使用内部类的好处:
1、内部类可以访问它所在作用域内的数据,包括私有数据
2、在同一个包中,内部类对于其他类不可见
3、使用匿名内部类可以在写回调函数时,减少代码量,逻辑更紧凑

好,大概就是以上3个好处了,那么再回头看为什么要用内部内来创建线程。
内部类只服务于某个特定的类,用内部类创建的线程一般用来执行某一个支线任务,不需要被外部的任何类访问到。达到隐藏细节,保证线程安全的目的。

作者: 邱纲    时间: 2012-2-19 09:30
有两种方式:
第一种 :继承Thread类
第二种:实现Runnable接口
不过一般建议用第二种实现方式,应该这种方式比较灵活一些。你多用用就知道了
作者: 左华清    时间: 2012-2-19 12:59
谢谢,学习了!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2