Java中实现线程的方式

Java 中实现线程的方式有两种:继承 Thread 类和实现 Runnable 接口

继承 Thread 类的方式实现线程

public class Main {
    public static void main(String[] args) {
        class MyThread extends Thread {
            @Override
            public void run() {
                System.out.println("Hello, I am a thread!"); // 线程执行的逻辑
            }
        }

        MyThread t = new MyThread();
        t.start();
    }
}

实现 Runnable 接口的方式实现线程

这里需要注意的是在使用实现 Runnable 接口的方式实现线程时,确实需要创建一个 Thread 对象来启动线程,但这并不意味着 Java 实现线程的本质只有一种方式,因为 Thread 类本质上只是一个线程执行的容器。

public class Main {
    public static void main(String[] args) {
        // Runnable 是函数式接口,可以使用 Lambda 表达式构造对象
        Runnable r = () -> {
            System.out.println("Hello, I am a thread!"); // 线程执行的逻辑
        };

        Thread t = new Thread(r);
        t.start();
    }
}

实现 Callable 接口和使用 Future 实现线程

public class Main {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Callable<String> callable = () -> {
            return "Hello, I am a thread!";
        };
        FutureTask<String> task = new FutureTask<>(callable); // 事实上 FutureTask 实现了 Future 和 Runnable 接口
        Thread t = new Thread(task);
        t.start();
        System.out.println(task.get());
    }
}

Executors 是怎么实现线程的(线程池是怎么实现线程的)?

Executors 使用的是实现 Runnable 接口的方式实现线程,它提供了一种方便的方式来创建和管理线程池,可以使用 Executors 工厂方法创建不同类型的线程池。

结论

使用实现 Runnable 接口的方式实现线程更加灵活,因为它可以避免单继承的限制,同时也可以更好地实现线程池等高级特性。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。