返回

JAVA线程的创建-面试题引发的思考

后端


面向对象程序设计的开端,是一场对源代码重用的探索。用工程化的方式组织开发,使开发者们开始形成协作的意识。多线程机制的加入,则如同一枚重磅炸弹,在程序开发的世界里炸开了花。

想学好JAVA多线程,先答一道面试题吧:创建线程,有哪几种方式?

这个问题,不知难倒了多少JAVA程序员。但答案其实很简单,无非三种:

  • 继承Thread类,重写run方法。
  • 实现Runnable接口,重写run方法。
  • 使用Callable和Future。

接下来,我们来详细分析一下这三种创建线程的方法。

1. 继承Thread类,重写run方法

这是最简单的一种创建线程的方法。只要继承Thread类,重写run方法,然后调用start()方法即可。代码如下:

public class MyThread extends Thread {

    @Override
    public void run() {
        // 线程体
    }

    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
    }
}

这种方法简单易用,但灵活性较差。因为线程类是单继承的,如果需要同时继承其他类,就无法使用这种方法创建线程。

2. 实现Runnable接口,重写run方法

这种方法比第一种方法灵活,它允许线程类同时继承其他类。只要实现Runnable接口,重写run方法,然后将Runnable接口的对象传递给Thread类的构造函数,并调用start()方法即可。代码如下:

public class MyThread implements Runnable {

    @Override
    public void run() {
        // 线程体
    }

    public static void main(String[] args) {
        MyThread thread = new MyThread();
        Thread t = new Thread(thread);
        t.start();
    }
}

这种方法的灵活性较强,但代码也比第一种方法复杂一些。

3. 使用Callable和Future

这种方法是Java5之后引入的,它允许线程返回一个结果。只要实现Callable接口,重写call()方法,然后将Callable接口的对象传递给FutureTask类的构造函数,并调用FutureTask类的run()方法即可。代码如下:

public class MyThread implements Callable<Integer> {

    @Override
    public Integer call() {
        // 线程体
        return 1;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyThread thread = new MyThread();
        FutureTask<Integer> task = new FutureTask<>(thread);
        Thread t = new Thread(task);
        t.start();
        Integer result = task.get();
        System.out.println(result);
    }
}

这种方法的灵活性最强,但代码也最复杂。

以上三种创建线程的方法,各有优缺点。在实际开发中,应根据具体情况选择合适的方法。


多线程机制的引入,让JAVA语言如虎添翼,在程序开发的世界里叱咤风云。但想要驾驭好多线程机制,还需要开发者们不断地学习和实践。只有这样,才能在纷繁复杂的代码世界里,游刃有余。