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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 芦青 中级黑马   /  2013-1-27 13:49  /  1615 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-29 11:44 编辑

class xc implements Runnable
{
        public void run()
        {
                //复写Runnable的Run方法..
        }
}

public class lei
{
        public static void main(String[] args)
        {
        {        
                xc a=new xc();
               
                Thread  t=new Thread(a);
               
                t.start();
               
        }
}



为什么Runnable接口的子类对象当成实际参数传递给Thread构造函数的时候..当Thread调用Start方法开启线程时,就可以调用到


Runnable接口的子类对象中的run方法了??求精辟点,易理解的语言...

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

3 个回复

倒序浏览
在Thread类的构造函数时候可以接受一个对象,但是为了安全规范这个对象必须实现Runnable接口。Thread类还有判断创建Thread对象时候传进来的对象是否为null,如果不为null就运行传进来的Runnable对象的run()方法


         

评分

参与人数 1黑马币 +6 收起 理由
Rancho_Gump + 6

查看全部评分

回复 使用道具 举报
托你的福,我第一次跑去看源码了,下面附上源代码
  1.     public Thread(Runnable target) {
  2.         init(null, target, "Thread-" + nextThreadNum(), 0);
  3.     }
  4.     private void init(ThreadGroup g, Runnable target, String name,
  5.                       long stackSize) {
  6.         if (name == null) {
  7.             throw new NullPointerException("name cannot be null");
  8.         }

  9.         Thread parent = currentThread();
  10.         SecurityManager security = System.getSecurityManager();
  11.         if (g == null) {
  12.             /* Determine if it's an applet or not */

  13.             /* If there is a security manager, ask the security manager
  14.                what to do. */
  15.             if (security != null) {
  16.                 g = security.getThreadGroup();
  17.             }

  18.             /* If the security doesn't have a strong opinion of the matter
  19.                use the parent thread group. */
  20.             if (g == null) {
  21.                 g = parent.getThreadGroup();
  22.             }
  23.         }

  24.         /* checkAccess regardless of whether or not threadgroup is
  25.            explicitly passed in. */
  26.         g.checkAccess();

  27.         /*
  28.          * Do we have the required permissions?
  29.          */
  30.         if (security != null) {
  31.             if (isCCLOverridden(getClass())) {
  32.                 security.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
  33.             }
  34.         }

  35.         g.addUnstarted();

  36.         this.group = g;
  37.         this.daemon = parent.isDaemon();
  38.         this.priority = parent.getPriority();
  39.         this.name = name.toCharArray();
  40.         if (security == null || isCCLOverridden(parent.getClass()))
  41.             this.contextClassLoader = parent.getContextClassLoader();
  42.         else
  43.             this.contextClassLoader = parent.contextClassLoader;
  44.         this.inheritedAccessControlContext = AccessController.getContext();
  45.         this.target = target;//看懂这句话就行了
  46.         setPriority(priority);
  47.         if (parent.inheritableThreadLocals != null)
  48.             this.inheritableThreadLocals =
  49.                 ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);
  50.         /* Stash the specified stack size in case the VM cares */
  51.         this.stackSize = stackSize;

  52.         /* Set thread ID */
  53.         tid = nextThreadID();
  54.     }
复制代码
  1.     public synchronized void start() {
  2.         /**
  3.          * This method is not invoked for the main method thread or "system"
  4.          * group threads created/set up by the VM. Any new functionality added
  5.          * to this method in the future may have to also be added to the VM.
  6.          *
  7.          * A zero status value corresponds to state "NEW".
  8.          */
  9.         if (threadStatus != 0)
  10.             throw new IllegalThreadStateException();

  11.         /* Notify the group that this thread is about to be started
  12.          * so that it can be added to the group's list of threads
  13.          * and the group's unstarted count can be decremented. */
  14.         group.add(this);

  15.         boolean started = false;
  16.         try {
  17.             start0();
  18.             started = true;
  19.         } finally {
  20.             try {
  21.                 if (!started) {
  22.                     group.threadStartFailed(this);
  23.                 }
  24.             } catch (Throwable ignore) {
  25.                 /* do nothing. If start0 threw a Throwable then
  26.                   it will be passed up the call stack */
  27.             }
  28.         }
  29.     }
  30.     private native void start0();

  31.     /**
  32.      * If this thread was constructed using a separate
  33.      * <code>Runnable</code> run object, then that
  34.      * <code>Runnable</code> object's <code>run</code> method is called;
  35.      * otherwise, this method does nothing and returns.
  36.      * <p>
  37.      * Subclasses of <code>Thread</code> should override this method.
  38.      *
  39.      * @see     #start()
  40.      * @see     #stop()
  41.      * @see     #Thread(ThreadGroup, Runnable, String)
  42.      */
  43.     @Override
  44.     public void run() {
  45.         if (target != null) {
  46.             target.run();//这句话看的懂吧
  47.         }
  48.     }
复制代码
乱七八糟的英文不用看,只看构造方法和start()方法就行了,因为你没抛出异常,所以catch语句和finally语句也无需看,这样就简单了

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9

查看全部评分

回复 使用道具 举报
本帖最后由 杨玲 于 2013-1-27 17:18 编辑

楼上源码都帖出来了,呵呵,不过简单总结一下就是在Thread类中定义了一个Runnable接口的引用,并实现了Runnable接口,覆写了它的run方法,在该方法中会先判断这个引用是否为空,如果是以继承Thread形式存在的话,这个run方法就被覆写了,它会调用被子类覆写的run方法,如果是实现Runnable接口的,并把其作为参数传递时,那么这时这个Runnable的引用不为空,在run方法中就会调用这个引用中的run方法.

评分

参与人数 1黑马币 +6 收起 理由
Rancho_Gump + 6

查看全部评分

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