本文共 1439 字,大约阅读时间需要 4 分钟。
内部类写法:(内部类MyThread继承Thread类,给MyThread创建对象,这个对象是线程对象)
Thread t1 = new MyThread();class MyThread extends Thread(){ @Override public void run(){ 想执行的任务代码 }}
匿名内部类写法:
Thread t1 = new Thread(){ @Override public void run(){ 想执行的任务代码 }}
(不存在lamda写法,因为lamda是实现接口,而且是仅有一个函数的接口)
启动线程
t1.start();
内部类写法:(内部类MyRunnable实现Runnable接口,给MyRunnable创建对象,这个对象是任务对象)
Runnable task2 = new MyRunnable();class MyRunnable implements Runnable(){ @Override public void run(){ 想执行的任务代码 }}
匿名内部类写法:
Runnable task2 = new Runnable(){ @Override public void run(){ 想执行的任务代码 }}
lamda写法:
Runnable task2 = () -> { 想执行的任务代码 }
把任务对象task2当作参数给Thread构造器:
Thread t2 = new Thread(task2, "t2");//给线程起名儿
启动线程:
t2.start();
看源码发现:
1、Thread是Runnable的实现类,且在Thread类中的run()就是调用target的run(),target对象Thread有参构造器的参数,是Runnable的一个对象。2、Runnable接口中只有一个方法run()方法。
所以:
法一:Thread子类直接重写Thread()中的run()方法 法二:Runnable实现类(对象)重写Runnable的run()方法,Thread调用这个方法法一的局限性在于:该类继承了Thread类,就不能继承其他类了,不满足实际的需求。所以更推荐法二,将想要多线程执行的任务写进Runnable实现类对象的run()方法中,而且可以有很多个Runnable实现类对象。
其他一些说法(不是完全理解):
1、法一把线程和任务合并在了一起,法二分开了 2、Runnable更容易与线程池等高级API配合,建议操作任务对象,不建议直接操作线程对象。 3、Runnable让任务脱离了Thread继承体系,更灵活。Java中,组合优于继承,Runnable和Thread的关系是组合的,而法一是继承关系。参考:
https://blog.csdn.net/qq_36877577/article/details/64905490 https://www.bilibili.com/video/BV16J411h7Rd?p=14