创建线程的两种传统方式
---》在Thread子类覆盖的run方法中编写运行代码
---》 在传递给Thread对象的Runnable对象的run方法中编写代码
---》总结:查看Thread对象的run方法的源代码,可以看到这两种方法都是在
调用Thread对象的run方法,如果Thread类的run方法没有被覆盖,并且为该
Thread对象设置了一个Runable对象,该run方法会调用Runnable对象的run
方法
---》问题:如果在Thread子类覆盖的run方法中编写了运行代码,也为Thread子类对象传递
了一个Runnable对象,那么,线程线程运行时的代码是子类的run方法的代码,还是Runnable
对象的run方法的代码?
涉及到的一个知识点,匿名内部类对象的构造方法如何调用父类的非默认构造方法。
---》多线程机制会提高程序的运行效率吗? 为什么会有多线程下载呢 ?
下面是代码的实现:
public static void main(String[]args) {
//方式一
Thread thread = new Thread() {
@Override
public void run () {
while (true) {
try{
Thread.sleep(500);
} catch (InterruptedException e){
e.printStackTrace() ;
}
System.out.println(Thread.currentThread().getName());
}
}
thread.start();
//方式二:(留给读者自己去看源码为何这样实现)下面的Runnable表示线程所要执行的代码
Thread thread2 = new Thread(new Runable(){
@Override
public void run () {
while (true) {
try{
Thread.sleep(500);
} catch (InterruptedException e){
e.printStackTrace() ;
}
System.out.println(Thread.currentThread().getName());
});
}
thread2.start();
//方式三
new Thread(new Runable(){
@Override
public void run () {
while (true) {
try{
Thread.sleep(500);
} catch (InterruptedException e){
e.printStackTrace() ;
}
System.out.println("Runnable"+Thread.currentThread().getName());
@Override
public void run () {
while (true) {
try{
Thread.sleep(500);
} catch (InterruptedException e){
e.printStackTrace() ;
}
System.out.println("Thread"+Thread.currentThread().getName());
}
}
思考:方式三运行的代码是Runable的代码还是Thread的代码,答案是Thread中的代码
分析:首先是new 了一个Thread的子类,然后在Thread构造中创建了一个Runnable的方法,
调用start()先去找的是new Thread()中的run方法,找自己的run方法,如果没找到用自己
父类的方法,父类的方法会去找Runnable运行,子类的run方法把父类的run方法覆盖了
所以以子类的方法为准,父类的全部都失效了.