java多线程

一、什么是线程

        线程是程序里能够独立运行的最小执行单元。它和进程不同,进程是程序在操作系统中的一次执行实例,而线程则是进程中的一个执行路径。多线程允许程序同时处理多个任务,以此提升程序的性能与响应速度。

线程的特点

        1.轻量级:创建和销毁线程的开销比进程小得多。因为线程共享进程的资源,所以在创建线程时,不需要像创建进程那样分配大量的系统资源。

        2.并发执行:同一进程中的多个线程可以并发执行,从而提高程序的执行效率。例如,在一个音乐播放软件中,一个线程可以负责播放音乐,另一个线程可以负责处理用户对播放进度的拖动操作,两个线程可以同时进行,互不干扰。

        3.共享资源:线程之间可以方便地共享进程的资源,这使得线程之间的通信和数据交换非常高效。但同时也需要注意线程同步问题,以避免多个线程同时访问共享资源时出现数据不一致的情况。

线程与进程的区别

        1.进程是资源分配的基本单位,而线程是程序执行的基本单位。一个进程可以包含多个线程,线程是进程的一部分。

        2.进程之间相互独立,各自拥有独立的内存空间和资源,进程间通信需要通过特定的机制,如管道、消息队列、共享内存等。而线程之间共享进程的资源,通信相对容易,但需要注意线程同步问题。

        3.进程的创建和销毁开销较大,而线程的创建和销毁开销较小。因此,在需要频繁创建和销毁执行单元的场景下,使用线程更为合适。


二、为什么要使用多线程

        1.提高程序执行效率。多线程可以让程序中的多个任务并发执行。例如在一个图形界面应用程序中,一个线程负责处理用户界面的交互,另一个线程负责执行复杂的数据计算任务。这样,用户在进行界面操作时不会因为数据计算的耗时操作而出现界面卡顿的情况,提高了整个程序的响应速度和执行效率。

        2.充分利用硬件资源。现代计算机通常具有多个处理器核心或多核处理器。多线程程序可以将不同的任务分配到不同的处理器核心上并行执行,使多个处理器核心都能得到充分利用,从而提高整个系统的资源利用率,发挥出硬件的最大性能。

        3.简化程序设计。将一个复杂的任务分解为多个相对简单的子任务,每个子任务由一个线程来处理,使得程序的结构更加清晰,易于理解和维护。


三、多线程的使用场景

        1.多任务处理:在图形界面应用程序中,通常会有一个主线程负责处理界面的绘制和用户交互,同时还有其他线程负责处理后台任务,如文件加载、数据计算等。这样可以避免界面卡顿,提高用户体验。

        2.服务器编程:在服务器端,通常会为每个客户端连接分配一个线程来处理请求。这样可以同时处理多个客户端的请求,提高服务器的并发处理能力。

        3.并发数据处理:在处理大量数据时,可以使用多线程技术将数据分成多个部分,每个线程处理一部分数据,从而加快数据处理的速度。


四、java多线程创建方式

        在java语言中,创建多线程的方式有继承Thread类、实现Runnable接口、实现callable接口、继承TimerTask类、线程池,下面一一介绍创建线程的方法:

1.继承Thread方法

        运行结果:

2.实现Runnable接口

        通过底层代码,可以知道Runnable接口是Thread的父类

        在java语言中,优先考虑使用Runnable接口,因为在继承中,java是单继承,如果继承Thread,就不能再继承其他类,而实现Runnable接口的方式,则可以多继承其他的类,如下图中,可以再多继承一个Other类。

        运行结果:

        

3.实现Callable接口

        实现Callable接口的方法,可以用来接收线程的返回值

        运行结果:

        

4.继承TimerTask

        通过底层代码,可以知道TimerTask也是继承Runnable接口

        示例代码:继承TimerTask

        运行结果:

5.线程池

        线程池是管理和复用线程的重要工具,它能有效提升应用性能并控制资源消耗。

        线程池的工作模式是预先创建一定数量的线程,当有任务提交时,就从线程池中获取空闲线程来执行任务,任务完成后线程不会被销毁,而是回到线程池等待下一个任务。这种模式避免了频繁创建和销毁线程带来的开销,还能对线程数量进行限制,防止资源过度使用。

        示例代码:

        创建线程池:

        创建线程:

        运行结果:

        


五、多线程同步机制

        1.暗锁机制synchronized 手动加锁。自动释放

                前提:多个线程持有同一个对象的锁

        运行结果:

        

synchronized也可以用来修饰方法,但是由于锁定的范围会变大,从而降低程序执行的性能

2.明锁机制lock 手动加锁,手动释放

        运行结果:

        


六、java多线程通信机制

        案例:创建两个线程,交替打印A和B

        线程1:打印A

        线程2:打印B

        运行结果:

        


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值