new Thread(new Runnable(){ public void run() {
System.out.println("你好!");
}

}).start(); new Thread(){ public void run() {
System.out.println("你好!");
}

}.start();

解决方案 »

  1.   

    线程的两种实现方式,一种是继承thread一种是实现Runnable接口
      

  2.   

    效果是一样的
    如果连Runnable都是匿名的,还是第二种简洁一些
      

  3.   

    jdk上是这么说的
    “Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。 设计该接口的目的是为希望在活动时执行代码的对象提供一个公共协议。例如,Thread 类实现了 Runnable。激活的意思是说某个线程已启动并且尚未停止。 此外,Runnable 为非 Thread 子类的类提供了一种激活方式。通过实例化某个 Thread 实例并将自身作为运行目标,就可以运行实现 Runnable 的类而无需创建 Thread 的子类。大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类创建子类。”
      

  4.   

    在你这个例子中没什么分别,第一种创建了2个实例,第二种创建一个1实例
    正式使用就看你的具体需求,Runnable是接口,灵活,因为java只能单继承,如果既想继承某个类又想多线程处理,即实现Runnable,否则两种都可以,Thread本身就是implements Runnable的
      

  5.   


    这两种方式除了是继承和实现的区别之外,没有其它的任何区别。
    因为一个类只能继承一个父类,却能实现多个接口(比如你现在有一个类已经有一个父类了,你没有办法继承Thread类了,那就可以实现Runnable接口,来达到相同的效果)。
    如果在你写的程序中你随便用那个达到的效果应该都是一样的。
      

  6.   


        public Thread(Runnable target) {
            init(null, target, "Thread-" + nextThreadNum(), 0);
        }    private void init(ThreadGroup g, Runnable target, String name,
                          long stackSize) {
            ......
            this.target = target;
            ......
        }    @Override
        public void run() {
            if (target != null) {
                target.run();
            }
        }
    以上是 Thread 类中的源代码
    由此可见几乎没有任何区别
    第二种方法:直接重写 run 方法的话
    可以少做一个 target != null 的判断
    可见性能略高的应该是 -- 第二种方法
    虽然只是高了那么一点点点点点点
      

  7.   

    线程实现的两种方式不过通常是用实现接口Runnable 来做任务的~ 
      

  8.   

    其实是实现Runnable 接口用的要好些,因为这样可以实现多线程公用一个实现了Runnable的对象
    class A implements Runnable{
      public void run() 
        {
         }
    }
    A a=new A();
    Thread aa=new Thread(a);
    aa.start;
    Thread bb=new Thread(a);
    bb.start;如果直接继承Thread类是做不到的
      

  9.   

    直接继承Thread的话,只能单继承成。如果实现Runnable接口的话,可以实现多继承。