1.线程:程序的执行线索
2.创建线程的两种方法:
a.
Thread thread = new Thread(){ public void run(){ } }
b.
Thread thread = new Thread(new Runnable(){ public void run(){ }});//更加体现面向对象的思维
3.在传递给Thread对象的Runnable对象的run方法中编写代码
查看Thread类的run方法的源码,可以看到其实这两种方式都是在调用Thread对象的run方法,如果Thread类的run方法没有被覆盖,并且为该Thread对象设置了一个Runnable对象,该run方法会调用Runnable对象的run方法。
4.question.如果在Thread子类覆盖的run方法中编写了运行代码也为Thread子类对象传递了一个Runnable对象,那么,线程运行时的执行代码是子类的run方法?
还是Runnable对象的run方法。(匿名内部类对象的构造方法如何调用父类的非默认构造方法)
new Thread(new Runnable(){ @Override public void run() { System.out.println("runnable"); } }){ public void run() { System.out.println("thread"); }; }.start();
thread
在这里复习一下java基础知识:内部类
public class ThreadDemo { public static class A{ //静态内部类 } public class B{ //成员内部类 class C{ //局部内部类 public void method(){ new Object(){ //匿名内部类 }; } } }}
关于构造器与父子类的关系:
public class FatherClazz { public FatherClazz() { System.out.println("FatherClazz"); } public static void main(String[] args) { new SonClazz(); } public static class SonClazz extends FatherClazz{ public SonClazz(){ System.out.println("SonClazz"); } }}
注:子类SonClazz 中有构造器,那么就调用子类的构造器,如果子类SonClazz 中无构造器,会调用父类的构造器。