匿名内部类就是没有名字的内部类,匿名内部类只能使用一次,它通常用来简化代码编写。
使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口。
以MVC架构为例,考虑如下场景。我们在jsp页面添加一个用户,需要将用户同步到第三方平台,为了不用等待第三方平台返回,这段逻辑我们交给一个线程去实现。
在userService代码里面,我们执行完addUser的dao操作,采用匿名内部类到方式实现上述逻辑。
可以用Thread类实现
new Thread(){
@Override
public void run() {
//do business
}
}.start();
也可以用Runnable接口实现
new Thread(new Runnable() {
@Override
public void run() {
//do business
}
}).start();
这样不用再去写一个线程类,简化类代码结构。
匿名内部类常用到地方:
线程调用
Java AWT里面到事件驱动、事件监听等
补充一个面试问题:java用Thread和Runnable实现线程的区别
1.Runnable可以避免由于java的单继承机制带来的局限。可以再继承其他类的同时,还能实现多线程的功能。当一个类extends其他类时,只能实现Runnable接口。
2.Runnable适合于多个相同程序代码线程去处理统一资源的情况,较好体现面向对象的编程的思想。
public class ThreadTest extends Thread {
private int count = 10;
public void run() {
while (count > 0) {
System.out.println(Thread.currentThread().getName() + " "
+ count--);
}
}
public static void main(String[] args) {
new ThreadTest().start();
new ThreadTest().start();
new ThreadTest().start();
new ThreadTest().start();
}
}
这段代码实际上时开启的4个线程。
public class RunnableTest implements Runnable {
private int count = 10;
public void run() {
while (count > 0) {
System.out.println(Thread.currentThread().getName() + " "
+ count--);
}
}
public static void main(String[] args) {
RunnableTest test = new RunnableTest();
new Thread(test).start();
new Thread(test).start();
new Thread(test).start();
new Thread(test).start();
}
}
这段代码开启的是一个线程,因为只有一个Runnable对象。
也就是说Thread是一个线程,Runnable是一个线程所要运行的代码,封装到一个对象当中去。