多线程——Runnable接口实现多线程(27)
视频:https://edu.aliyun.com/course/36/lesson/list?spm=5176.8764728.aliyun-edu-course-tab.2.W6yOMF
1.Thread类的核心功能是进行线程的启动,但是如果一个类直接继承了Thread类,问题是单继承。Java又提供另一种实现模式:Runnable接口。
@FunctionalInterface public interface Runnable{ public void run(); }
可以发现在接口里面同时存在有一个run()方法,这一点和Thread是相同的,因为只要是接口了子类就必须覆写run()方法。
范例:利用Runnable定义线程主体类
class MyThread implements Runnable{ private String title; public MyThread(String title){ this.title=title; } @Override public void run() { for(int i=0;i<10;i++){ System.out.println(this.title+".x="+i); } } }
但是新的问题出现了,此时MyThread类继承的不是Thread类,而实现了Runnable接口,虽然解决了单继承,但是没有了start()方法被继承了。那么此时就需要关注Thread类提供的构造方法:
构造方法:
public Thread(Runnable target),可以接收Runnable的接口对象,那么通过Thread可以启动。
范例:启动多线程
public class ThreadTest { public static void main(String[] args) { MyThread mt1=new MyThread3("线程1"); MyThread mt2=new MyThread3("线程2"); MyThread mt3=new MyThread3("线程3"); new Thread(mt1).start(); new Thread(mt2).start(); new Thread(mt3).start(); } }
这个时候就启动了多线程,也就是说多线程的启动永远都是Thread类的start()方法。但是要注意的是,对于此时的Runnable接口对象也可以采用匿名内部类或Lambda表达式来时行定义。
范例:通过匿名内部类定义操作
public class ThreadTest { public static void main(String[] args) { new Thread(new Runnable(){ @Override public void run() { System.out.println("Hello World!"); } }).start(); } }
范例:使用Lambda表达式
public class ThreadTest3 { public static void main(String[] args) { new Thread(()->System.out.println("Hello world!")).start(); } }
在实际开发之中,Runnable接口的子类的定义形式可能很少出现,以上的这种操作是最为常见的做法。