要说Java中的线程使用,有两种方式,一个是继承Thread类,直接调用子类的run()方法,
另一个是产生一个实现Runnable接口的类,
做为Thread类的直接创建入参,启动均调用start方法,前者会直接调用子类的run()实现逻辑,后者则是通过Thread中的run方法去调用Runnable中run()的实现。
我们知道Thread类实现了Runnable接口,看Thread源码就知道上面是怎么调用的。
init中会将 target赋值给成员变量target,
start()所调用的run方法的代码是
@Override public void run() { if (target != null) { target.run(); } }
got it ?
当然,我从这里看到了两种编程思想 继承(inheritance) 和 组合(composition),后者实现了类与类间的松耦合(coupling)
另外,采用Runnable参数方式,意味着多个线程会共享Runnable实现类中定义的一些信息(同一Runnable实例),会有线程安全问题。
对于无法继承则可以采用Runnable方式。
如果是单纯的创建线程,非Runnable方式的资源开销要小些。