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

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 方法。

3. 实现 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 接口

PS:更多精彩内容,请查看 --> 《Java 技术点合集》
PS:更多精彩内容,请查看 --> 《Java 技术点合集》
PS:更多精彩内容,请查看 --> 《Java 技术点合集》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卜大爷

觉得不错的可以给我加油哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值