线程的创建方式

最近在java工程师的面试中,经常被问到,请聊下线程的创建方式?而本篇文章就聊一下Java中创建线程的方式。

第一种:继承Thread,并重写run方法

代码如下:

//1、继承Thread 重写run方法

Thread thread=new Thread(){

    @Override

    public void run() {

        System.out.println(Thread.currentThread().getId()+"---->当前时间:"+LocalDateTime.now());

    }

};

//启动线程

thread.start();

第二种:实现Runnable接口,并重写run方法

//2、线程的第二种创建方式  实现接口

Runnable runnable=new Runnable() {

    @Override

    public void run() {

        System.out.println(Thread.currentThread().getName()+"------>"+LocalDateTime.now());

    }

};

//创建线程对象

Thread thread=new Thread(runnable);

//启动线程

thread.start();

第三种:Callable接口和Future接口

在java5中,提供了Callable接口和Future接口,

Callable接口可以是Runnable接口的增强版,Callable接口提供了一个call()方法作为线程执行体,call()方法比run()方法功能更强大Future接口来代表Callable接口里的call()方法的返回值,并为Future接口提供了一个FutureTask实现类,该实现类实现了Future接口,并实现了Runnable接口,所以这样可以作为Thread的target

//创建对应的接口实现类和对应的返回值对象

FutureTask<String> futureTask=new FutureTask<String>(new Callable<String>() {

    @Override

    public String call() throws Exception {

        return Thread.currentThread().getName()+"----->"+LocalDateTime.now();

    }

});

//创建线程

Thread thread=new Thread(futureTask);

//启动线程

thread.start();

System.out.println(futureTask.get());
 
那么上述的三种创建方式有何优缺呢?
继承Thread类来创建多线程,这种方式的优缺如下:
优点:
        编写简单,使用当前的线程对象也很简单。
缺点:
        因为继承了Thread类,所以不能再继承其他父类。毕竟Java只允许单继承。
实现Runnable、Callable接口方式创建多线程的优缺如下:
优点
        线程只是实现了Runable接口或者Callable接口,还可以继承其它类,毕竟Java允许多实现。
        多个线程可以共享同一个target对象,比较适合多个相同线程来处理同一份资源的情况,比如卖票。
缺点:
编程相对繁琐,如果需要使用当前线程,则必须使用Thread的currentThread()方法。
总结:
依据面向对象设计原则和日常的开发规范,推荐使用,实现Runnable、Callable接口的方式来创建多线程。
原文地址:https://www.cnblogs.com/qfchen/p/10655697.html