创建线程

创建线程经常说有构造一个Thread方法,和实现Runable接口的方法,这种说法不是很严谨。线程的执行单元就是run方法。准确的讲,创建线程只有一种方式那就是构造Thread类,而实现线程的执行单元则有两种方式,第一种是重写Thread的run方法,第二种是实现Runnable接口中的run方法,并且将Runnable实例用作构造Thread的参数。

面试可能会遇见问创建线程有哪几种方式?

1、继承Thread类创建线程类

定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。
创建Thread子类的实例,即创建了线程对象。
调用线程对象的start()方法来启动该线程。

2、通过Runnable接口创建线程类

定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
调用线程对象的start()方法来启动该线程。

3、通过Callable和Future创建线程

创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。
创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了
该Callable对象的call()方法的返回值。 使用FutureTask对象作为Thread对象的target创建并启动新线程。 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。

4、通过匿名类的方法创建线程(上面三种方式都可用匿名类创建线程)

public static void main(String[] args) {
        //继承Thread的匿名内部类线程创建方法
        new Thread(){//继承Thread类
            public void run(){//重写run方法
                for (int i = 0;i < 2;i++){//将要执行的代码写在run方法里
                    System.out.println("wowowwo~~~~");
                }
            }
        }.start();//开启线程
        //实现Runnable的匿名内部类的线程创建方法
        new Thread(new Runnable() {//将Run那边了的子类对象传递给Thread的构造方法
            public void run() {//重写run方法
                for (int i = 0; i < 3; i++) {//将要执行的代码写在run方法里
                    System.out.println("Runnable的匿名--->线程");
                }
            }
        }).start();//开启线程
    }

 

创建线程的几种方式对比

继承Thread

 优点:可以直接使用Thread类中的方法,代码简单

 缺点:继承Thread类之后就不能继承其他的类

实现Runnable接口

优点:即使自定义类已经有父类了也不受影响,因为可以实现多个接口

缺点: 在run方法内部需要获取到当前线程的Thread对象后才能使用Thread中的方法

实现Callable接口

优点:可以获取返回值,可以抛出异常

缺点:代码编写较为复杂

 

 

参考:https://www.jianshu.com/p/4e6998ad6afc

 

 

 

 

posted @ 2019-11-16 19:44  弘666  阅读(127)  评论(0)    收藏  举报