java创建线程的三种方式

一、java中线程的创建方式

在Java中,创建线程主要有三种方式,即继承Thread类,实现Runnable接口,实现Callable接口,一个继承,两个实现。

1. 继承Thread类

写一个类MyThread,继承Thread类,覆写run()方法,创建Thread子类实例thread,通过thread调用start()启动线程。

public class MyThread extends Thread{
    @Override // 实现Thread类,覆写run方法
    public void run() {
        System.out.println("继承Thread方式");
        // ... 具体业务逻辑
    }

    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start(); // 启动线程
    }
}

2. 实现Runnable接口

写一个类MyRunnable实现RUnnable接口,覆写run()方法,创建MyRunnable对象runnable,将runnable作为参数调用Thread有参构造,创建线程thread,调用start()启动线程。

public class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("实现Runnable接口方式");
        // ...具体业务逻辑
    }

    public static void main(String[] args) {
        // 创建Runnable实现类对象
        MyRunnable runnable = new MyRunnable();
        // 将runnable作为参数,调用Thread有参构造得到线程
        Thread thread = new Thread(runnable);
        thread.start(); // 启动线程
    }
}

3. 实现Callable接口

写一个类MyCallable实现Callable接口,覆写call方法(返回值为Callable泛型),然后创建实现类对象callable,再创建FutureTask对象,将callable作为参数传入,得到对象futureTask,再创建Thread对象,将futureTask作为参数传入,调用start方法启动线程。想要获得线程执行后的返回值,用futureTask调用get()方法,获取返回值。

public class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        System.out.println("实现Callable接口方式");
        // ... 具体业务逻辑
        return "返回值"; // 返回值,类型和Callable泛型一致,这里用String举例
    }

    public static void main(String[] args) {
        // 创建Callable实现类对象
        MyCallable callable = new MyCallable();
        // 将callable作为参数创建FutureTask对象
        FutureTask<String> futureTask = new FutureTask<>(callable);
        // 将futureTask作为参数创建线程
        Thread thread = new Thread(futureTask);
        thread.start(); // 启动线程
        try {
            // 获取线程执行后的返回值
            String result = futureTask.get();
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

二、线程创建三种方式对比

  1. 继承和实现的区别,单继承多实现,实现扩展性更强。
  2. 三者创建线程的写法不同。
  3. 集成Thread和实现Runnable没有返回值,且覆写的run()方法。实现Callable方式,覆写的call()方法,有返回值,对应泛型。

注意:
调用start()才是启动线程,如果只是调用run()或者call()方法,都只是调用实例方法,并不是启动线程。

你可能感兴趣的:(java)