Java并发编程(二)创建线程

逆流者 2021年02月21日 26次浏览

创建线程的三种方式

  • 继承Thread类并重写run方法
  • 实现Runnable接口的run方法
  • 使用FutureTask方式

继承Thread类并重写run方法

public class ThreadTest {

    public static class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + ": 我是一个子线程");
        }
    }

    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
    }
}
Thread-0: 我是一个子线程

实现Runnable接口的run方法

public class RunnableTaskTest {

    public static class RunnableTask implements Runnable {

        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + ": 我是一个子线程");
        }
    }

    public static void main(String[] args) {
        RunnableTask task = new RunnableTask();
        new Thread(task).start();
        new Thread(task).start();
    }
}
Thread-0: 我是一个子线程
Thread-1: 我是一个子线程

使用FutureTask方式

public class CallableTaskTest {

    public static class CallableTask implements Callable<String> {

        @Override
        public String call() throws Exception {
            System.out.println(Thread.currentThread().getName() + ": 我是一个子线程");
            return "hello";
        }
    }

    public static void main(String[] args) {
        // 创建异步任务
        FutureTask<String> futureTask = new FutureTask<>(new CallableTask());
        // 启动线程
        new Thread(futureTask).start();

        String result = null;
        try {
            result = futureTask.get();
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println(result);
    }
}
Thread-0: 我是一个子线程
hello

三种方式对比

  • 继承方式方便传参, 可以在子类中定义成员变量, 通过set方法或构造器进行初始化参数, 但是Java不支持多继承, 所以继承了Thread类的子类不能继承其他类了;
  • Runnable没有继承的限制
  • FuntrueTask方式可以拿到任务的返回结果, 前两种方式不行