技术文章

Java初学有必要深入多线程编程吗,如何学习?

多线程作为JAVA学习的主要难点之一,有开发复杂,出现问题难以复现等特性,但却是不得不掌握的知识点,因为JAVA中使用多线程的场景实在是太多了。

先看下多线程(所有语言)的发展背景:早期的计算器都是单核CPU,想要获得更高的性能只能是扩展硬件(摩尔定律),但是很快硬件的发展达到了瓶颈,要提高计算能力只能是横向扩展(增加计算机CPU核心,现在也没有单核心的计算机了吧),因为一个CPU在同一个时间点上只能处理一个线程,现在的服务器少则16核,如果使用单线程编程,相当于你只用了1/16的CPU资源,暴殄天物!所以多线程是很有必要学习的。

Java多线程编程

多线程可以用来在什么场景使用呢?

1,密集型计算:将一个大任务进行拆分,使用多线程进行执行,假设从1加到100万,你单线程需要8分钟,然后你分为16个线程做计算(半分钟),加上汇总的时间和创建销毁线程的时间,不会超过一分钟,7分钟喝咖啡足够了吧。

下载大文件的时候拆分成几个小文件,充分利用带宽!

2,异步调用:多线程和异步不是一个概念,但是异步一定是多线程的,如果是同步调用发生阻塞的时候,CPU资源就浪费了,但如果是异步,可以执行别的线程,提高CPU使用率!

3,web容器技术:一个请求使用一个线程去处理(多数容器已弃用,改用netty架构,一个线程遍历连接,分发给线程池进行任务处理)

4,线程池:例如数据库连接池,JAVA中的线程池等,线程池创建多个线程来处理数据,避免频繁创建线程的开销!

5,批处理:用于多个batch任务可并行处理,batch任务中的job可并行处理的情况!

可以说多线程代表着高效率的运行程序,所以有很大的理由学习好多线程!

Java多线程编程

怎么学好多线程呢?

①,明白计算机原理:多核CPU的运行方式,线程执行,什么时候容易阻塞,寄存器,内存(可对照理解JAVA内存模型)等!

②,线程基本操作:线程的创建,实现,开始线程,掌握线程状态,线程中断,线程休眠与唤醒等!

③,掌握多线程常用技术:线程池的几种创建方式,使用synchonize,读写锁等加锁操作,使用阻塞队列实现顺序执行,使用threadlocal实现线程本地变量,使用future实现异步回调,使用fork-join框架并行处理任务,JAVA8的并行流式处理也是不错的选择!

④,学会抛弃多线程:netty使用网络IO多路复用避免多线程开销,redis使用单线程才能被作为分布式锁,全局唯一id生成的线程安全策略!

Java多线程编程