Java创建线程有几种方式

Java创建线程有5种方式

“Java创建线程有几种方式”这是一个很古老又很热门的面试话题,刚学习Java的能说出3种,认真复习的能说出4种,能够列出来的方式其实有5种,没错,5种!

①、继承Thread类,重写run方法

    public static void main(String[] args) {
        Run1 run1 = new Run1();
        run1.run();
    }
	static class Run1 extends Thread {
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                System.out.println("no." + i);
            }
        }
    }

②、实现Runnable接口,重写run方法

    public static void main(String[] args) {
        Run2 run2 = new Run2();
        run2.run();
    }
    static class Run2 implements Runnable {
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                System.out.println("no." + i);
            }
        }
    }

③、实现Callable,重写call方法,配合FuturTask

    public static void main(String[] args) throws Exception {
        MyCallable myCallable = new MyCallable();
        FutureTask futureTask = new FutureTask<>(myCallable);
        Thread thread = new Thread(futureTask);
        thread.start();
        Object count = futureTask.get();
        System.out.println(count);
     }
        static class MyCallable implements Callable {
        @Override
        public Object call() throws Exception {
            int count = 0;
            for (int i = 0; i < 100; i++) {
                count += i;
            }
            return count;
        }
    }

④、基于线程池ThreadPoolExecutor构建线程

⑤、lambda方式(也可以算一种)

        Thread l = new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println("no." + i);
            }
        });
        l.start();

现在,忘掉上面的一切,以后就说归根结底只有1种!

在面试的时候,能说出有上面5种已经是比较出色了,不过在面试官眼里只能算背的不错,还看不出真正的能力。能够翻看源码,发现其共同点才能算得上优秀。

一步一步来

①、我们先看Thread类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其实Thread已经实现了Runnable接口,并“重写”了run方法,所以我们只不过是利用继承的方式,间接的重写了Runnable接口的run方法,下面是Runnable接口的源码。

在这里插入图片描述

②、我们看看FutureTask
在这里插入图片描述
在这里插入图片描述

FutureTask类实现了RunnableFuture接口,
RunnableFuture接口继承了Runnable接口。
FutureTask类里重写了run方法,用的就是我们自定义的MyCallable。(这块有点绕,建议仔细跟一下源码)

在这里插入图片描述

③、我们用线程池ThreadPoolExecutor类,每次构建的工作线程都是用的Worker类,可以看出,Worker类也是实现的Runnable接口。
在这里插入图片描述
在这里插入图片描述

综上,追其底层,线程创建都是基于实现Runnable接口,重写run方法实现的。

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值