匿名内部类
关于匿名内部类和lambda的基础可以看我博客文章:内部类 , Lambda
看完上面链接的两篇文章你就能看懂下面代码了:
1. 匿名内部类的方式
/**
*匿名内部类的方式启动线程
*/
public class T2 {
public static void main(String[] args) {
new Thread(){
public void run(){
System.out.println("thread1 start ... ");
}
}.start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread2 start .... ");
}
}).start();
}
}
第1段相当于继承Thread的方式;第二段相当于实现Runnable的方式。
如果我们将上面两段代码合并呢?
package com.yy.concurrent.base1;
/**
*匿名内部类的方式启动线程
*/
public class T2 {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("runnable");
}
}){
public void run(){
System.out.println("sub");
}
}.start();
}
}
大家觉得最终输出结果是多少?不卖关子了,是:sub。为什么会这样呢?这就是重写导致的
我们进入源码(Thread(Runnable run)):
target传进来,然后执行init方法
然后再进入init方法里面的init方法
然后我们可以看到传进来的target已经赋给了Thread类属性target了,然后我们再看run方法
此时target不为空,应该是执行target.run(),即输出结果是Runnable,但是注意注意!!!!我们我看我们的代码,我们再T1类里面重写了run方法,所以执行的是重写的方法!
2. Lambda方式
看了我博客lambda一文后就可以直接看懂下面代码了
public class Test{
public static void main(String[] args) {
/*
匿名内部类的方式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("nihao");
}
}).start();
System.out.println("你好");
*/
//lambda的方式
new Thread(()-> {
for(int i = 1 ; i<100 ; i++){
System.out.println("It is a lambda function!");
}
}).start();
}
}