日期:2014-05-20  浏览次数:20765 次

java thread类
比如 thread(Runable taget)
里面说,是构造一个新的方法老指定taget 的runn()方法

void.run()
启动这个线程并引发调用这个run方法

但是我看 jdk 源码 里面thread 类
里面 run 方法 就一个方法体 没 内容啊 怎么回事呢。

------解决方案--------------------
呃,Runable是一个接口,里面声明了一个run()方法,Thread类实现了此接口。自定义一个实现Runable接口的类并重写run()方法,然后通过此类实例构造一个Thread对象,再通过Thread类的start()方法调用自定义类的run()方法,代理设计模式的引用。
------解决方案--------------------
一般都要自定义自己的线程,有两种方法,1是扩展(继承)Thread类,2是实现Runnable接口
不管哪种方法,都得实现继承来的run方法。
thread(Runable taget),事实上你传进来的自定义的线程类已经实现了run方法,然后在构造真正的线程,执行线程时,调用的其实是你自己定义的那上线程类的run方法(继承自父类)。
------解决方案--------------------
Java code

new Thread(Runnable R);

------解决方案--------------------
Java code

public void run() {
    if (target != null) {
        target.run();
    }
    }

------解决方案--------------------
thread类run方法并不是你自己去调用的都是由Thread类的start方法启动的

start方法的文档说明:
Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread. 
可以看到是JVM调用了run方法。

其实你看JDK的源代码就知道Thread类其实也实现了Runnable接口,你了使用重载的构造函数Thread(Runnable target)只是将实现了Runnable接口的类定义在外部而已。

下面是run方法的文档说明
If this thread was constructed using a separate Runnable run object, then that Runnable object's run method is called; otherwise, this method does nothing and returns. 
Subclasses of Thread should override this method.
可以看到,如果使用实现了Runnable接口的对象,则执行我们自定义那个对象的run方法,否则这个方法将什么也不做,并且返回。文档明确建议Thread类的子类应该重写run方法。