今天面试的时候被问到这个题目,当时确实很懵逼,现在想想从三种方法的实现角度可以推断出来。
第一种创建方式:
继承Thread,并且重写run方法。
- package com.easytopit.thread;
- public class ExtendsThread extends Thread {
- @Override
- public void run() {
- for(int i = 1;i<=100;i++){
- System.out.println("使用继承Thread的方法====="+i);
- }
- }
- }
实现Runable接口,并且重写run方法。
- package com.easytopit.thread;
- public class RunableThread implements Runnable {
- @Override
- public void run() {
- for(int i = 1;i<=100;i++){
- System.out.println("使用实现Runnable方法来创建线程====="+i);
- }
- }
- }
实现Callable接口,并且重写call方法,通过FutureTask类来创建线程
- package com.easytopit.thread;
- import java.util.concurrent.Callable;
- public class CallableThread implements Callable<Integer> {
- @Override
- public Integer call() throws Exception {
- for(int i = 1;i<=100;i++){
- System.out.println("实现Callable接口并且实现call方法====="+i);
- }
- return null;
- }
- }
测试类如下:
- package com.easytopit.thread;
- import java.util.concurrent.Callable;
- import java.util.concurrent.FutureTask;
- public class ThreadTest {
- public static void main(String[] args) {
- //创建线程
- Thread t1 = new ExtendsThread();
- Runnable run = new RunableThread();
- Thread t2 = new Thread(run);
- Callable<Integer> call = new CallableThread();
- FutureTask<Integer> ft = new FutureTask<>(call);
- Thread t3 = new Thread(ft);
- //只有start方法才是启动线程
- t1.start();
- t2.start();
- t3.start();
- }
- }
继承Thread类的,代码编写简单,并且可以使用currentThread()方法来访问当前线程,但是继承该类之后不能继承其它的类。
实现Runable接口,有利于扩展性,实现了该接口之后,还可以实现其它接口或者继承其它的类。
实现Callable接口,编写相对于其它两种比较复杂,但是可以有返回值并且能抛出异常。