Java 创建线程的三种方式总结

阿木木 阿木木 | 76 | 2022-08-19

Java 创建线程的三种方式总结
我们在开发中,为了提高程序的运行效率,经常会使用多线程的方式来实现并发操作。

那么创建线程有几种方式呢?

1、继承 Thread 类
直接继承 Thread 即可实现多线程。Thread 本质上也是实现了 Runnable 接口,线程启动的唯一方法是通过 Thread 类的 start() 实例方法实现的。start() 方法调用时,系统才会真正创建一个新线程,并执行 run() 方法,它是一个native方法。

   class MyThread extends Thread {
        @Override
        public void run() {
            super.run();
        }
    }
    
    private void testThread(){
        Thread thread = new MyThread();
        thread.start();
    }

这种方式的缺点就是,Java 的单继承限制,想通过 Thread 实现多线程,就只能继承 Thread 类,不可继承其他类。

2、实现 Runnable 接口
如果自己的类已经继承了其他类,这时就只能通过实现 Runnable 接口来实现多线程了。

不过,继承 Runnable 接口后,想要启动线程,需要把该类的对象作为参数,传递给 Thread 的构造函数,并使用 Thread 类的实例方法 start 来启动。

public class TestThread extends A implements Runnable {
    public void run() {
        ……    
    }
}

//启动线程
TestThread testThread = new TestThread();
Thread thread = new Thread(testThread);
thread.start();

Thread 内部的 run 方法我们可以看到它的实现原理:

private Runnable target;
    
public void run() {
  if (target != null) {
   target.run();
  }
}

target 是我们传递进来的 Runnable 对象,当线程执行时,线程的 run 方法会直接调用 Runnable 对象的 run 方法。

  1. 实现 Callable 接口

如果想要执行的线程有返回,怎么处理呢?这时应该使用 Callable 接口了,与 Runnable 相比,Callable 可以有返回值,返回值通过 FutureTask 进行封装。

public class MyCallable implements Callable<Integer> {
    public Integer call() {
        return 111;
    }
}

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

比较
这几种线程创建方式中,实现接口会更好一些,因为:

Java 不支持多重继承,因此继承了 Thread 类就无法继承其它类,但是可以实现多个接口。

类可能只要求可执行就行,继承整个 Thread 类开销过大。

另外,如果需要有返回值时,使用 Callable 接口是适合的。

总结
本节我们回顾了,Java中创建线程的几种方式。

继承 Thread 类
实现 Runnable 接口
实现 Callable 接口

文章标签: JAVA
推荐指数:

真诚点赞 诚不我欺~

Java 创建线程的三种方式总结

点赞 收藏 评论