创建线程
创建线程经常说有构造一个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

浙公网安备 33010602011771号