有多少种实现多线程的方式?(看完一定有全新的收获)

有多少种实现多线程的方式?

一、 从不同的角度看,会有不同的答案。

网络上查到的,答案不一,他们的回答不能算错。

下面我们正式进入 我对有多少种实现多线程的方式的理解吧

首先我们看一下oracle的java 有多少种实现多线程的方式:
file
file
我们从官方文档中可以看出,创建Java线程的方式有两种,分别是继承Thread类和实现Runnable接口创建线程

一、继承Thread类和实现Runnable接口创建线程

1.1 代码demo

我把demo的代码贴出来,一看就能懂啦!

/**
 * 描述:   用Thread方式实现线程
 */
public class ThreadStyle extends Thread{

    public static void main(String[] args) {
        new ThreadStyle().run();
    }
    @Override
    public void run() {
        System.out.println("用Thread类实现线程");
    }
}
//描述: 用Runnable方式创建线程
public class RunableStyle implements Runnable{
    
    public static void main(String[] args) {
        Thread thread = new Thread(new RunableStyle());
        thread.start();
    }

    @Override
    public void run() {
        System.out.println("用Runnable方式实现线程");
    }
}

1.2 两种方式的区别

方法一和方法二,也就是“继承Thread类然后重写run()”和“实现Runnable接口并传入
Thread类”在实现多线程的本质上,并没有区别,都是最终调用了start()方法来新建
线程。这两个方法的最主要区别在于run()方法的内容来源:
方法一:最终调用target.run();
方法二:run()整个都被重写

我们再看源码,加深理解
file
综上,准确来说,创建线程只有一种方式,就是构造Thread类,而实现run方法的执行单元有两种方式:
(1)继承Thread类覆盖run方法
(2)实现Runnable接口,并把实例化对象传给Thread

1.3 两种方式哪个更好?

实现 Runnable!接口 更好
(1)从代码架构角度:Runnable对象可以实现解耦,实现Runnable接口的run方法是具体的执行任务,并且现Runnable接口的类也不负责创建线程等工作。
(2)从新建线程的损耗:使用继承 Thread 的方式的话,那么每次想新建一个任务,只能新建一个独立的线程,而这样做的损耗会比较大,如果使用实现Runnable接口和线程池,就可以大大减小这样的损耗
(3)从扩展性角度:继承 Thread 类以后,由于 Java 语言不支持双继承,这样就无法再继承其他的类,限制了可扩展性

1.4 如果同时使用两种方式呢?会发生什么?

我们可以通过下图,清晰的看到,使用两种方式的结果是,只使用了继承Thread的方式,因为只要有继承Thread就会覆盖掉Thread的run方法(那三行代码),就不能调用到target对象的run方法。

file

二、通过线程池创建线程demo和源码解读

2.1 demo案例截图

file

2.2 源码分析

我debug源码发现,最终是通过实现Runnable接口的方式 实现的。 严格来说线程池是实现Runnable接口的方式创建线程的一个包装,不能算是方式
file

三、其他“创建线程的方式”(不能算严格意义上的方式)

计时器:也是对实现Runnable接口的方式创建线程的一个包装
匿名内部类和Lambda表达式:是快捷实现Runnable接口的方式创建线程

不管怎么创建,最本质的方式只有一种:构建Thread类;实现run方法的执行单元有两种途径

版权声明:
作者:十下
链接:https://blog.edkso.cn/?p=902
来源:十下博客
文章版权归作者所有,未经允许请勿转载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在实现大规模程序时需要使用多线程程序。多线程程序有并发和并行两方式。并发指的是多个线程交替执行,看起来好像是同时执行,但实际上只能有一个线程执行。并行则是多个线程同时执行,可以利用多核CPU的优势来提高程序性能。实现多线程程序有多方式,如使用Thread类、Runnable接口或者使用线程池等。 ### 回答2: 在计算机系统中,每个应用程序都有自己的进程,在进程中又有多个线程。单线程程序在运行过程中有一个线程,会按照顺序一个一个执行任务,这样会导致应用程序的性能降低。而多线程程序则可以提高应用程序的性能,因为它有多个线程可以同时执行,完成更多的任务,实现更高的效率。 常见的使用多线程程序的场景包括: 1.当一个程序需要做很多事情时,每个事情需要耗费很多时间。如果使用单线程程序的话,只能一个一个的逐个完成,但是如果使用多线程程序的话,可以同时启动多个线程去完成这些事情,这样可以大大减少整个程序的运行时间。 2.当一个程序需要有及时交互和响应的时候,如果使用单线程程序的话,可能会因为等一个流程走完才能进行下一个操作,而造成用户的等待时间。而多线程程序可以同时完成多个任务,这样可以缩短用户的等待时间。 3.当程序需要完成一些复杂的任务时,可能需要同时调用多个模块的功能,通过多线程程序可以让各个模块在独立的线程中执行,减少不必要的等待时间。 实现多线程程序的方式有以下几种: 1.继承Thread类,重写run()方法,并在程序中使用start()方法启动线程。 2.实现Runnable接口,并在程序中使用Thread类的构造方法创建线程。 3.使用线程池技术来管理线程,可以避免不必要的开销。 4.使用Java 8中新加入的CompletableFuture类来实现异步执行操作,也就是将任务分解成多个阶段,在不同阶段中进行多线程执行。 无论是实现多线程程序中的哪方式,都需要在程序中设置线程的优先级、同步机制、线程状态等关键性质,以保证多线程程序的准确性和可靠性。 ### 回答3: 为什么要使用多线程程序? 在计算机科学中,线程是一个执行序列,是进程中的一个单独的控制流程。多线程可以把一个进程分成多个线程并行执行,使得处理能力大大提高。多线程程序因其高效率和可扩展性而被广泛应用于操作系统、图形界面系统、网络通信等领域。 使用多线程程序的优点有: 1. 提高程序性能:多线程程序能充分利用计算机的多核处理器,利用CPU并行计算,相对于单线程程序,性能大大提升。 2. 优化用户界面:多线程程序可以同时进行多个任务,其中一个任务可以处理用户输入,另一个任务可以渲染用户界面等等,同时提高响应速度和用户体验。 3. 提高系统资源利用率:多线程程序可以利用空闲资源,充分利用计算机资源,减少计算机空置,更好地解决了挤占资源问题。 实现多线程程序有哪些方式多线程实现方式有三:继承Thread类、实现Runnable接口实现Callable接口。通过创建线程对象,然后通过start方法启动线程,即可实现多线程。 1. 继承Thread类。为创建线程,我们需要创建一个Thread实例,并重写其中的run方法,用来定义线程执行的任务。创建Thread实例后,再通过调用start方法来启动该线程。 2. 实现Runnable接口Runnable接口只定义了run方法,也是用来定义线程执行的任务和逻辑。需要创建一个实现Runnable接口的类,并实现其中的run方法,再通过创建Thread实例,传入Runnable实例,并调用start方法启动线程。 3. 实现Callable接口。Callable接口也只定义了call方法,该方法与run方法不同的是,call方法还能返回执行结果。与Runnable接口类似,需要创建一个实现Callable接口的类,并实现其中的call方法。Callable需要借助ExecutorService对象来启动线程。 总之,无论使用哪方式多线程程序都可以提高程序性能,优化用户界面和提高资源利用率。具体的实现方式可以根据实际需求灵活选用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值