根据Thread类中的run方法
public void run() {
if (this.target == null)
return;
this.target.run();
}
可以知道运行多线程代码有两种方式,一种是运行Thread类run方法中的代码,一种是运行target中的run代码。
方法一:运行Thread类run方法中的代码
Thread thread1=new Thread(){
@Override
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
};
thread1.start();
方法二:运行target中的run代码
target是何物,我们来追踪一下:
private Runnable target;
他是Thread类的一个Runnable参数,那么他是如何传参进来的呢?
public Thread(Runnable paramRunnable) {
init(null, paramRunnable, "Thread-" + nextThreadNum(), 0L);
}
通过Thread类构造方法传Runnable进来,再调用init方法
private void init(ThreadGroup paramThreadGroup, Runnable paramRunnable,
String paramString, long paramLong) {
init(paramThreadGroup, paramRunnable, paramString, paramLong, null);
}
这是Thread类的一个私有初始化方法
再调用方法
private void init(ThreadGroup paramThreadGroup, Runnable paramRunnable,
String paramString, long paramLong,
AccessControlContext paramAccessControlContext) {
}
在这个方法里有步骤
this.target = paramRunnable;
从而给target赋值。
改方法创建改多线程方式:
Thread thread2=new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
}
});
thread2.start();
那么问题又来了,如果同时存在方法一和方法二的情况,如下代码:
Thread thread3=new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("run:"+Thread.currentThread().getName());
}
}
}){
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread:"+Thread.currentThread().getName());
}
}
};
thread3.start();
那么该执行哪个代码呢?根据java编程思想,我们知道方法一是覆写了父类的run方法,方法二是父类固有的,所以代码在执行的时候是选择执行子类的run方法,如果子类run方法不存在,才去父类寻找runnable的run方法