第一个new当然是用来创建Thread对象的,有没有发现
new Thread().start();这样也是不会报错的,这主要是因为只有Thread才有
start()方法,而start()的功能是什么?
start()就是负责线程调用run()方法执行代码,仔细分析,就会发现,问题都出现在run()方法内部,它是怎么调用资源的?
!--首先,看看API中对Thread类中run方法的描述:
如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。Thread 的子类应该重写该方法。
!--明确一点:Thread类实现了Runnable,那么它本身必然会有一个不返回任何操作Run()方法
,所以new Thread().start();没有任何数据显示
!--这里可以知道:原来后面无论是带Runnable构造参数也好,还是Thread子类也罢,都只不过是对一个线程中唯一的run()方法进行不断的复写而已,当线程还没有开启前,就是不断的更新run方法:下面
int i=0;
i=1;
i=2;
----------如果最后对i进行操作:int j=i;结果当然是2;
!--所以run方法不断更新,先是Ruunable匿名子类中的run()方法内容,然后又更行了,Tread匿名之类中的run()方法内容,我们可以这么理解,线程中run()方法一直都在,只是它的内容在不断的变化,而最终的结果,就是start()调用run()方法后的操作数据....
!--补充一下Thread带Runnable子类的构造函数:
因为资源这个事物不确定,为了提高程序扩展性,于是就对外提供了一个Runnable接口,让线程能够动态的运行,而运行的关键就是run方法代码,也就是说,run()方法也只不过是,把需要操作的数据进行一个封装然后定义一个run标记而已,而线程运行函数strat()就是专门调用run标记里面的内容加载到线程当中 |