A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王红潮 中级黑马   /  2012-9-20 13:29  /  2630 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王红潮 于 2012-9-20 19:24 编辑

new Thread(
    new Runnable(){
     public void run(){
      while(true){
       try {
        Thread.sleep(500);
       } catch (InterruptedException e) {
        
        e.printStackTrace();
       }
       System.out.println("runnable : " + Thread.currentThread().getName());
      }
     }
    }
   
    ){
   public void run(){
    while(true){
     try {
      Thread.sleep(500);
     } catch (InterruptedException e) {
      
      e.printStackTrace();
     }
     System.out.println("Thread : " + Thread.currentThread().getName());
    }
   }
   
  }.start();

为什么先执行Thread子类的代码,而不执行runnable封装的代码?

3 个回复

倒序浏览
本帖最后由 彭润生 于 2012-9-20 13:47 编辑

new Thread(new Runnable(){
         public void run(){
          try {
     Thread.sleep(500);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName()+"------run1");
         }
        }){
         public void run(){
        try {
    Thread.sleep(500);
    } catch (InterruptedException e) {
     e.printStackTrace();
  }
   System.out.println(Thread.currentThread().getName()+"--------run2");
      }
        }.start();//你这个start本来就是调用的是你这个匿名类的类中的方法,所以就是执行run2这个线程。
         }
}//如果去掉这些,那么就是执行Thread(Runnable)Thread新的对象了。

回复 使用道具 举报
本帖最后由 程金 于 2012-9-20 13:53 编辑

你这代码能运行?语法错误
你的结构是:new Thread( new Runnable({run方法}) ){run()}.start().
new Thread( new Runnable{run方法} )这已经是一个Thread实例了,后面怎么能再跟方法体呢?你想一个线程实例运行两个线程?
一个线程对应一个线程实例
应该改成这样,两个线程都运行.
  1. new Thread(
  2.     new Runnable(){
  3.      public void run(){
  4.       while(true){
  5.        try {
  6.         Thread.sleep(500);
  7.        } catch (InterruptedException e) {
  8.         
  9.         e.printStackTrace();
  10.        }
  11.        System.out.println("runnable : " + Thread.currentThread().getName());
  12.       }
  13.      }
  14.     }
  15.    
  16.     ).start();

  17. new Thread{
  18.    public void run(){
  19.     while(true){
  20.      try {
  21.       Thread.sleep(500);
  22.      } catch (InterruptedException e) {
  23.       
  24.       e.printStackTrace();
  25.      }
  26.      System.out.println("Thread : " + Thread.currentThread().getName());
  27.     }
  28.    }
  29.    
  30.   }.start();
复制代码
回复 使用道具 举报
本帖最后由 谭立文 于 2012-9-20 14:48 编辑

package com.wenfengkeji.thread;
public class Demo5 extends Thread{
public Demo5(Runnable r)
{
  super(r);
}
@Override
public void run() {
  System.out.println("haha");
}
public static void main(String[] args)
{
  AA  target = new AA();
  Demo5 t = new Demo5(target);
  t.start();
new Thread(new Runnable(){
   @Override
   public void run() {
    System.out.println("a");
   }
  }){
   @Override
   public void run()
   {
    System.out.println("b");
   }
  }.start();    //这段代码的层次关系就相当于是我给你写出来的  
      
}
}
class AA implements Runnable
{
public void run()
{
  System.out.println("Runable");
}
}
Demo5继承与thread然后重写了父类的  run方法  , 然后以实现了Runnable的AA 对象为实例new了一个线程
我们看看 Thread(Ruannble r)的源代码。
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
    }
public void run() {   //这是Thread类中run方法的源代码
if (target != null) {
     target.run();
}
    }            如果   t .start() 调用的是Thread类run方法 且 target不为null则执行  实现了Runnable接口的类中的run方法,可是 Demo5对run方法进行了重写(覆盖了父类的run方法),这样就不会调用父类的
run方法 也就不会执行Runnable接口中的run方法 ,如果你将重写Thread的run方法改为super.run()就是执行实现了Runnabll接口类的 run方法中的代码体了;
new Thread(new Runnable(){
   @Override
   public void run() {
    System.out.println("a");
   }
  }){
   @Override
   public void run()
   {
    super.run();
   }
  }.start();

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马