多线程原理和实战

1.1  两个技术面试故事

     1. 面试故事一

      候选人是一位至少有着6年以上的开发经验,毕业于某二本院校计算机专业、看上去非常老练的Java高级工程师,简称 L 君。L 君所应聘的岗位是一个网络设备配置管理类项目的MDE(模块设计师,Java主程)。该项目的特点是:有着8年历史代码积累,反复地修修补补,项目迫切需要进行架构解耦,想找一位开发基础扎实、擅长进行模块解耦的MDE。

       为了考察 L 君的编程水平,笔者先给 L 君上了一道正餐前的开胃菜,出了一个比较简单的题目:

       程序开发时为什么要用多线程,单线程不是很好吗?多线程有什么意义?多线程会带来哪些问题,如何解决?

       以上问题对于一个合格的Java工程师来说是非常简单的。出人意料的是,这位有着6年以上开发经验的 L 君竟然没有答上来。L 君的理由是这个问题太理论、太基础,已经忘记其答案了。呜呼哀哉,这么简单的基础知识都忘记了。当然,L 君也就不好意思,只能有怏怏离去了。

       为什么答不上来呢?可能的原因从 L 君的简历可以探知一二:L 君做了多年传统web开发,在工作过程中,估计 L 君完全是埋头干活,每天只顾着完成领导(开发经理)分配的小任务,完成Web模块的CRUD(增删改查)工作,完全没有去系统地看书学习和理解Java的基础知识,连基础的东西都丢了。

     2.面试故事二

       候选人是从重庆一所双一流大学毕业了一年的初级Java工程师,简称 Y 君。在面试前,Y 君已经过了一面,并且前面的同事反馈说 Y 君的技术不错。看上去Y君拿到 Offer 已经没什么悬念了。在面试时,考察多线程知识似乎已成习惯,在Y君自我介绍之后,于是一上来就出了古老的面试题:

       什么是线程安全问题,“++”运算是不是线程安全的?

     3.面试总结

       两个真真切切的面试故事已经讲完。实际上,笔者面试过的很多候选人都有一个共性问题:Java基础知识尤其是多线程,高并发知识非常欠缺。所以很遗憾,很多候选人无缘优质Offer。

      总体而言,多线程是Java程序运行的基础性机制

1.2无处不在的进程和线程

1.2.1

进程一直以来没有完美的定义,一般进程主要是程序段,数据段,进程控制块组成,进度控制块就说指PCB

1.2.2

线程是指一个进程代码段的一次顺序执行流程,线程是CPU调度的最小单位,一个进程包含一个或多个线程

Java程序的进程执行过程就是标准的多进程执行过程。每当使用Java命令执行一个类,实际上就是启动了一个JVM进程。理论上,在该进程的内部至少会启动两个进程,一个是main线程,另一个是GC(垃圾回收)线程。实际上,执行一个java程序,通过Process Explorer,远远不止两个,达到18个之多

1.2.3

1.3创建线程的4种方法

Thread类

Runnable

Callable和FutrueTask

线程池

1.4线程的核心原理

调度和时间片

线程优先级

线程周期

jstack工具

1.5线程的基本操作

线程名称的设置和获取

线程的sleep操作

线程的interrupt操作

线程的join操作

线程的yield操作

线程的daemon操作

线程状态总结

1.6线程池原理与实战

JUC的线程池架构

Executors的4种快捷创建线程池的方法

线程池的标准创建方法

向线程池提交任务的两种方式

线程池的任务跳读流程

任务阻塞队列

调度器的钩子方法

线程池的拒绝策略

线程池的优雅关闭

Executors快捷创建线程池的潜在问题

1.7确定线程池的线程数

1.8ThreadLocal原理与实战

待续(升级中......)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明雨星云

感谢,我会继续创作更优质作品

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值