使用Thread类的确可以方便地实现多线程,但是这种方式最大的缺点就是单继承局限。为此在java中也可以利用Runnable接口来实现多线程,此接口的定义如下。
@FunctionalInterface //从JDK1.8引入了Lambda表达式后就变为了函数式接口
public interface Runnable {
public void run();
}
Runnable接口从JDK1.8开始成为一个函数式的接口,这样就可以在代码中直接利用Lambda表达式来实现线程主体代码,同时在该接口中提供有run()方法进行线程执行功能定义。
范例:通过Runnable接口实现多线程。
public class MyThread306 implements Runnable {
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public MyThread306(String title) {
super();
this.title = title;
}
@Override
public void run() {
for(int x=0;x<10;x++) {
System.out.println(this.title+"运行,x="+x);
}
}
}
利用Thread类定义的线程类可以直接在子类继承Thread类中提供start()方法进行多线程的启动,但是一旦实现了Runnable接口则MyThread306类中将不再提供start()方法,所以为了继续使用Thread类启动多线程,此时就可以利用Thread类中的构造方法进行线程对象的包裹。
Thread类构造方法:public Thread(Runnable target)。
在Thread类的构造方法中明确的接收Runnable子类对象,这样就可以使用Thread.start()方法启动多线程。
范例:启动多线程
public class ThreadDemo306 {
public static void main(String[] args) {
Thread threadA=new Thread(new MyThread02("线程A"));
Thread threadB=new Thread(new MyThread02("线程B"));
Thread threadC=new Thread(new MyThread02("线程C"));
threadA.start(); //启动多线程
threadB.start(); //启动多线程
threadC.start(); //启动多线程
}
}
执行结果
线程B运行,x=0
线程B运行,x=1
线程B运行,x=2
线程A运行,x=0
线程A运行,x=1
线程A运行,x=2
线程A运行,x=3
线程A运行,x=4
线程A运行,x=5
线程A运行,x=6
线程C运行,x=0
线程C运行,x=1
线程C运行,x=2
线程C运行,x=3
线程C运行,x=4
线程C运行,x=5
线程C运行,x=6
线程C运行,x=7
线程C运行,x=8
线程C运行,x=9
线程A运行,x=7
线程A运行,x=8
线程B运行,x=3
线程B运行,x=4
线程B运行,x=5
线程B运行,x=6
线程B运行,x=7
线程B运行,x=8
线程B运行,x=9
线程A运行,x=9
本程序利用Thread类构造了3个线程类对象(线程的主体方法由Runnable接口子类实行),随后利用start方法分别启动3个线程对象并发执行run()方法。
范例:通过Lambda表达式定义线程方法体
package cn.mldn.demo;
public class ThreadDemo {
public static void main(String[] args) {
for (int x = 0; x < 3; x++) {
String title = "线程对象-" + x;
new Thread(() -> {// Lambda实现线程体
for (int y = 0; y < 10; y++) {
System.out.println(title + "运行,y = " + y);
}
}).start(); // 启动线程对象
}
}
}