最近在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接口的方式来创建多线程。