宁波IT培训
美国上市IT培训机构

400-111-8989

Java多线程学习资料


Java多线程我个人觉得是JavaSe中最难的一部分,我以前也是感觉学会了,但是真正有多线程的需求却不知道怎么下手,实际上还是对多线程这块知识了解不深刻,不知道多线程api的应用场景,不知道多线程的运行流程等等,本篇文章将使用实例+图解+源码的方式来解析Java多线程。

文章篇幅较长,大家也可以有选择的看具体章节,建议多线程的代码全部手敲,永远不要相信你看到的结论,自己编码后运行出来的,才是自己的。

一、什么是Java多线程?

1、进程与线程进程

当一个程序被运行,就开启了一个进程, 比如启动了qq,word

程序由指令和数据组成,指令要运行,数据要加载,指令被cpu加载运行,数据被加载到内存,指令运行时可由cpu调度硬盘、网络等设备

线程

一个进程内可分为多个线程

一个线程就是一个指令流,cpu调度的最小单位,由cpu一条一条执行指令

2、并行与并发并发:单核cpu运行多线程时,时间片进行很快的切换。线程轮流执行cpu

并行:多核cpu运行 多线程时,真正的在同一时刻运行

Java提供了丰富的api来支持多线程。

二、为什么用多线程?

多线程能实现的都可以用单线程来完成,那单线程运行的好好的,为什么Java要引入多线程的概念呢?

多线程的好处:

程序运行的更快!快!快!

充分利用cpu资源,目前几乎没有线上的cpu是单核的,发挥多核cpu强大的能力

三、多线程难在哪里?

单线程只有一条执行线,过程容易理解,可以在大脑中清晰的勾勒出代码的执行流程

多线程却是多条线,而且一般多条线之间有交互,多条线之间需要通信,一般难点有以下几点

多线程的执行结果不确定,受到cpu调度的影响

多线程的安全问题

线程资源宝贵,依赖线程池操作线程,线程池的参数设置问题

多线程执行是动态的,同时的,难以追踪过程

多线程的底层是操作系统层面的,源码难度大

有时候希望自己变成一个字节穿梭于服务器中,搞清楚来龙去脉,就像无敌破坏王一样(没看过这部电影的可以看下,脑洞大开)。

四、Java多线程的基本使用

定义任务、创建和运行线程任务:线程的执行体。也就是我们的核心代码逻辑

定义任务

继承Thread类 (可以说是 将任务和线程合并在一起)

实现Runnable接口 (可以说是 将任务和线程分开了)

实现Callable接口 (利用FutureTask执行任务)

Thread实现任务的局限性

任务逻辑写在Thread类的run方法中,有单继承的局限性

创建多线程时,每个任务有成员变量时不共享,必须加static才能做到共享

Runnable和Callable解决了Thread的局限性

但是Runbale相比Callable有以下的局限性

任务没有返回值

任务无法抛异常给调用方

上下文切换多核cpu下,多线程是并行工作的,如果线程数多,单个核又会并发的调度线程,运行时会有上下文切换的概念

cpu执行线程的任务时,会为线程分配时间片,以下几种情况会发生上下文切换。

线程的cpu时间片用完

垃圾回收

线程自己调用了 sleep、yield、wait、join、park、synchronized、lock 等方法

当发生上下文切换时,操作系统会保存当前线程的状态,并恢复另一个线程的状态,jvm中有块内存地址叫程序计数器,用于记录线程执行到哪一行代码,是线程私有的。

idea打断点的时候可以设置为Thread模式,idea的debug模式可以看出栈帧的变化

线程的礼让-yield()&线程的优先级yield()方法会让运行中的线程切换到就绪状态,重新争抢cpu的时间片,争抢时是否获取到时间片看cpu的分配。

守护线程默认情况下,Java进程需要等待所有线程都运行结束,才会结束,有一种特殊线程叫守护线程,当所有的非守护线程都结束后,即使它没有执行完,也会强制结束。

默认的线程都是非守护线程。

垃圾回收线程就是典型的守护线程

线程的阻塞线程的阻塞可以分为好多种,从操作系统层面和Java层面阻塞的定义可能不同,但是广义上使得线程阻塞的方式有下面几种

BIO阻塞,即使用了阻塞式的io流

sleep(long time) 让线程休眠进入阻塞状态

a.join() 调用该方法的线程进入阻塞,等待a线程执行完恢复运行

sychronized或ReentrantLock 造成线程未获得锁进入阻塞状态 (同步锁章节细说)

获得锁之后调用wait()方法 也会让线程进入阻塞状态 (同步锁章节细说)

LockSupport.park() 让线程进入阻塞状态 (同步锁章节细说)

sleep()

使线程休眠,会将运行中的线程进入阻塞状态。当休眠时间结束后,重新争抢cpu的时间片继续运行

免责声明:内容来源于公开网络,若涉及侵权联系尽快删除!

预约申请免费试听课

怕钱不够?就业挣钱后再付学费!    怕学不会?从入学起,达内定制课程!     担心就业?达内多家实践企业供你挑选 !

【免责声明】本文部分系转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与联系我们,我们会予以更改或删除相关文章,以保证您的权益!
上一篇:如何从Java培训到Java工程师
下一篇:Java学习笔记:继承知识及特点介绍

程序员想要拿高薪应该具备哪些技能

不到 20 人的互联网公司该去吗

成长6大关键词是什么

达内---面试真题思路解析

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

  • 搜索抖音号

    搜索抖音号:1821685962

    免费领取达内课程视频学习资料

Copyright © 2021 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
江西省

贵州省

广西省

海南省