多线程——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接口的子类的定义形式可能很少出现,以上的这种操作是最为常见的做法。

原文地址:https://www.cnblogs.com/dengyt/p/6953680.html