java多线程的实现方式总结

	一个项目所用的技术往往是由业务所驱动的,平常我们写的最多的是业务的CRUD,这是一个普遍的现象,要想往上提升,往往绕不开多线程知识,这篇文章是LZ对多线程实现的一些看法

多线程的三种实现方式

目前多线程的实现方式有三种,让我带您一一看来

继承Thread类

这是我们比较熟悉的一种,废话不多说,先来看看他的使用代码

public class ThreadTest {
    public static void main(String[] args) {
        /**
         *
         第一种,继承Thread类
         */
        new ThreadDemo().start();
        /**
    }
    static class  ThreadDemo extends Thread{
        @Override
        public void run() {
            System.out.println("第一种实现方式!:继承Thread类");
        }
    }
}

实现Runable接口

这也是我们比较熟悉的一种,以下是代码:

public class ThreadTest {
    public static void main(String[] args) {
        /**
         *
         第二种,实现runable 接口
         */
        RunableDemo runableDemo=new RunableDemo();
        new Thread(runableDemo).start();
       
    }  
    static class  RunableDemo implements Runnable{

        @Override
        public void run() {
            System.out.println("第二种实现方式!:实现Runnable接口");
        }
    }
   
}

实现Callable接口

这种实现方式,可能初学者见得比较少,也是先上代码

public class ThreadTest {
    public static void main(String[] args) {
        /**
         *
         第三种。实现callable接口
         */
        CallableDemo callableDemo=new CallableDemo();
        FutureTask futureTask=new FutureTask(callableDemo);
        new Thread(futureTask).start();
        System.out.println(futureTask.get().toString());//得到任务返回值
    }  
    static class CallableDemo implements Callable{
        @Override
        public Object call() throws Exception {
            System.out.println("第三种实现方式!:实现Callable接口");
            return "test";;
        }
    }
}

三种实现方式的区别

第一种和第二种实现方式都是没有返回值的,也是大家所熟知的,一个继承类,一个实现接口,就不多说了,第三种方法返回了一个Object,这种实现方法可以应用于需要知道任务结果的场景
从代码中可以看到他的使用方式有点不一样,多了FutureTask包装Callable的步骤,然后再是用Thread类的start方法启动,我们点进去FutureTask的源码看看:在这里插入图片描述
在这里插入图片描述
相信您也看到了,他最终还是实现了Runnable接口。至于FutureTask,这里就不细讲了,设计到的东西就多了,您现在只要知道get()方法可以拿到任务的返回值就行。之后会细讲这些

三种实现方式的关联

三种实现方式最终都是调用Thread类的start方法来启动线程,来看看Thread类的源码
来自jdk1.8

看到了没,Thread类也是实现了Runable接口,我们都知道多线程是用来做异步任务的,从代码中可以看出run方法是具体做的事情(任务),而Thread类是装异步任务的一个容器,start()方法是这个容器启动任务run()方法的钥匙
总结下多线程启动的底层(源码层)必要条件:

	1、Thread容器(装任务)
	2、实现Runable接口(任务)
	3、调用Thread.start()(启动任务容器)

之后讲的线程池虽然看上去,没有了这些步骤,实际上是将他们封装到了底层了,这个之后再讲。

lz有话说

这篇文章是楼主在一个周末心血来潮下笔的,第一次写技术文章,才知道原创作者的不容易 ,lz才疏学浅,肯定有很多地方没有注意到,如有大牛看到,望您不吝赐教

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值