Java初学有必要深入多线程编程吗,如何学习?
多线程作为JAVA学习的主要难点之一,有开发复杂,出现问题难以复现等特性,但却是不得不掌握的知识点,因为JAVA中使用多线程的场景实在是太多了。
先看下多线程(所有语言)的发展背景:早期的计算器都是单核CPU,想要获得更高的性能只能是扩展硬件(摩尔定律),但是很快硬件的发展达到了瓶颈,要提高计算能力只能是横向扩展(增加计算机CPU核心,现在也没有单核心的计算机了吧),因为一个CPU在同一个时间点上只能处理一个线程,现在的服务器少则16核,如果使用单线程编程,相当于你只用了1/16的CPU资源,暴殄天物!所以多线程是很有必要学习的。
多线程可以用来在什么场景使用呢?
1,密集型计算:将一个大任务进行拆分,使用多线程进行执行,假设从1加到100万,你单线程需要8分钟,然后你分为16个线程做计算(半分钟),加上汇总的时间和创建销毁线程的时间,不会超过一分钟,7分钟喝咖啡足够了吧。
下载大文件的时候拆分成几个小文件,充分利用带宽!
2,异步调用:多线程和异步不是一个概念,但是异步一定是多线程的,如果是同步调用发生阻塞的时候,CPU资源就浪费了,但如果是异步,可以执行别的线程,提高CPU使用率!
3,web容器技术:一个请求使用一个线程去处理(多数容器已弃用,改用netty架构,一个线程遍历连接,分发给线程池进行任务处理)
4,线程池:例如数据库连接池,JAVA中的线程池等,线程池创建多个线程来处理数据,避免频繁创建线程的开销!
5,批处理:用于多个batch任务可并行处理,batch任务中的job可并行处理的情况!
可以说多线程代表着高效率的运行程序,所以有很大的理由学习好多线程!
怎么学好多线程呢?
①,明白计算机原理:多核CPU的运行方式,线程执行,什么时候容易阻塞,寄存器,内存(可对照理解JAVA内存模型)等!
②,线程基本操作:线程的创建,实现,开始线程,掌握线程状态,线程中断,线程休眠与唤醒等!
③,掌握多线程常用技术:线程池的几种创建方式,使用synchonize,读写锁等加锁操作,使用阻塞队列实现顺序执行,使用threadlocal实现线程本地变量,使用future实现异步回调,使用fork-join框架并行处理任务,JAVA8的并行流式处理也是不错的选择!
④,学会抛弃多线程:netty使用网络IO多路复用避免多线程开销,redis使用单线程才能被作为分布式锁,全局唯一id生成的线程安全策略!
不是说多线程复杂就不用,也不是说多线程高效就一定用,一切根据场景来定,多线程开发中的实际案例,可随时交流,更多的技术分享,敬请关注。。。
谢邀~
Java的多线程确实是Java编程的难点之一,是否要学习以及如何学习,提一些建议,希望对大家有帮助。
是否要学习Java多线程
其实这是一道送分题,建议Java程序员都要深入学习;
在Java开发过程中,有些技术可能很长时间都不会用到,但如果了解的话,在学习其他知识的时候会理解的更加深刻,比如JVM,比如多线程。
另外一方面,面试经常会被问到多线程方面的问题,特别是面试高级程序员,以及面试大厂的时候,多线程的问题出现率很高。
作为初学者来说,可以先了解,在没有熟练掌握之前,要谨慎使用。
如何学习Java多线程
Java多线程确实难,很多工作多年的程序员,也不敢说自己熟练掌握Java多线程。简单说一下Java多线程需要学习的内容:
主要的知识点:如何创建线程;线程的状态和生命周期;Java多线程编程的关键字,比如Volatile、synchronized等;线程状态转换;线程调度等等;
要了解线程池,做到熟练使用(自己写不出来多线程,就用线程池);
了解什么是线程安全,为什么要保证线程安全;Java很多其他的类,都是区分线程安全和线程不安全的,比如Vector和ArrayList(并可以了解Concurrent并发包);
书籍的话推荐《Java并发编程实践》,不过对于初学者来说,这本书比较晦涩;
推荐一个网站,大家可以跟着教程学习,免费的,还可以在线做练习:
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注;关注后可私信【资料】两字,获取更多学习资料。
谢谢悟空小秘书的邀请。
对于初学者而言,没必要深入去学习多线程,而且对于Java开发而言,真正用到多线程编程的地方并不是太多,当然这也和你所做的东西有关,比如游戏编程,网络通讯,这个多线程是少不了的,但对于MIS系统而言,多线程用途并不多,所以除非你工作必需刚开始没必要深入学习多线程。
对于初学者,重点放在学习好基础语法,掌握Web开发或者安卓开发的流程,学习开发过程中常用的工具和框架,说白了就是先学会怎么用,后续在工作中不断的丰富自己的经验。本人从事Java开发有很多年了,也许是从事Web开发的缘故,刚开始几乎就接触不到多线程,也只要在后来的业务中才用到多线程的东西。
总之具体问题具体分析,技术是用来开发软件的,软件是为业务需要服务的,如果因为工作需要可以深入去研究,如果工作暂时不需要,可以把重心放在基础上吧。
初学者,建议还是先学好基础知识(计算机体系结构和原理、操作系统),多线程也是基础知识,属于稍高级部分,可自行安排学习计划。
至于如何入手,建议通过一个简单的socket客户端和服务端开始(可以扩展到自定义应用层协议),然后实现一个单线程的网络服务器、然后多线程、然后NIO。期间,对相关知识体系进行整理,这样下来,基本对多线程就有一个整体的认知了。
多线程和程序语言其实是没有关系的。程序是告诉计算机干什么和怎么干活的,程序的改进都是基于计算机的体系结构和原理,更合理的利用计算机。多线程(多进程)和其他所有计算机技术一样,都是为了在满足人们实际需要的基础上,最大限度的利用计算机资源。
java面试中算法方面应该如何准备?
Java面试中经常问到的算法题目如下:
- 二叉树宽度遍历
- 红黑树
- 数据结构的话,链表,树,图的基本知识得懂
- 了解树的先序遍历,中序遍历,后序遍历。图的广度优先搜索算法,深度优先搜索算法。
- 手撕算法:反转单链表
- 手撕算法:实现类似微博子结构的数据结构,输入一系列父子关系,输出一个类似微博评论的父子结构图
- 手写java多线程
- 手写java的soeket编程,服务端和客户端
- 手撕算法: 爬楼梯,写出状态转移方程
- 智力题:时针分针什么时候重合
以上是总结的Java面试中有关算法的高频问题。
除此之外,Java面试中还会问到Spring+多线程JVM+集合Spring+数据库计算机网路+中间件等相关问题,【2019年最新BAT高级Java必考面试题+答案】送给大家,本文下面点赞,关注+私信回复【bat】,即可领取。
点赞+关注+私信[bat],即可领取。
我曾经面试过很多一线互联网大公司,确实这一类的公司面试的时候比较注重算法(不过自己的经验和朋友的说法来看,工作中从来都用不到)!
问的算法方面的知识也不会很深,比如之前在一家公司,要求我写一个二分法查找的伪代码,就写个思路即可,还有的要求说出二叉搜索树,红黑树,还有诸如冒泡排序,快速排序,插入排序等方式的性能以及如何选择最优的方式!
其实如果不是跟大数据,搜索,统计这些息息相关的工作岗位,问的算法都比较简单,就看你有没有了解过基本算法和解决思路!
其实,在面试过程中数据结构问的更多一些,比如说hashMap的内部结构,如何扩容,扩容时候的线程安全问题,JAVA8中为什么加入红黑树?arraylist,linkedlist区别与应用场景?等等这种JAVA中常用的数据结构的深入理解!
所以,如果您要面试的话,我的建议是,基本的算法,比如二分查找,递归,基本的排序算法等掌握其思路,写出伪代码,基本的数据结构掌握其底层源码和优缺点!基本算法和数据结构这一块就OK了!