创建Thread的三种方式

294 阅读1分钟

一、三种方式:

1、继承Thread类

2、实现Runnable接口

public class HowToCreateThread {

    static class Thread1 extends Thread {
        @Override
        public void run() {
            System.out.println("Hello Thread.");
        }
    }

    static class Thread2 implements Runnable {

        @Override
        public void run() {
            System.out.println("Hello Thread2");
        }

    }

    public static void main(String[] args) {
        new Thread1().start();
        new Thread(new Thread2()).start();
        new Thread(() -> {                  //lamda表达式的方式
            System.out.println("Test");
        }).start();
    }
}

3、FutureTask的方式

public class CallableTest implements Callable<Integer> {

    public Integer call() throws Exception {
        int sum = 0;
        for (int i = 0; i < 100000; i++) {
            sum += i;
        }

        return sum;
    }

    public static void main(String[] args) {
        CallableTest td = new CallableTest();
        FutureTask<Integer> ft = new FutureTask<>(td);
        new Thread(ft).start();

        try {
            Integer sum = ft.get();
            System.out.println(sum);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

    }
}

当然有的人说第三种方式是lamda表达式的方式,这个自己清楚就行了。没必要执泥于此。

二、区别:

1、继承Thread的方式,好处是方便传参,可以在子类里添加成员变量,通过set方法设置参数或者通过构造函数进行传递,不好的地方是由于JAVA没有多继承,就不能继承其他类了。

2、实现Runnable的方式是只能使用主线程里面被声明为final的变量,但是可以实现多个接口。

3、FutureTask的方式可以有返回值,前两个没有。