首页 > 代码库 > 轻松学会多线程(一)——多线程介绍
轻松学会多线程(一)——多线程介绍
在大数据,高并发的需求中,如何让自己所在的企业,在物竞天择的恶劣环境下,生存并且更好的生存下来呢?这就避免不了编写并发程序。而且在软件设计之初,我们就要考虑,哪些串行程序使用并行方式运行会更加高效。这就要涉及到多任务间的协作和数据共享等问题。
如今多核时代的不断发展,早已告别了单核处理器的年代。看看周围同事的电脑,至少都是四核的处理器,更别说工作站、服务器了。而我们所编写的串行程序,每一次运行,都只是在一个处理器上运行的。也就是说,我们只使用了不到四分之一的CPU系统资源,这无疑是一种极大的资源浪费。所以说,Java对多线程的支持,为多核计算提供了强有力的保障。
那么,我们从今天开始,就来聊聊多线程。我会尽量使用我的理解与经验来阐述,希望对你有帮助。
多线程编程的入门其实并不难。只不过,使用到多线程的情况,都是实际需求中复杂的业务需求。也就是说,多线程的用途就是用来解决实际需求中复杂业务需求的。在这个过程中,我们要考虑程序的并发控制、数据的同步、数据共享、信号量控制、任务协作等等 。
那什么样的问题算是复杂的问题呢?我的理解:处理几千条几万条数据,在难的需求,也是小数据的处理,更别谈无需高并发;而对于多少多少T的数据,无论是多么普通的查询,都能算得上一个复杂需求。
就像当初国家主席形容中国国情一样:多么微小的问题,乘以13亿之后,都会是一个大问题;多么巨大的问题,除以13亿,都会是变得很简单。
我们生活中就有很多很多 多线程的例子,我清晰记得我在上初中的时候,学过一篇课文《统筹方法》。这篇文章主要是告诉我们要合理利用时间。文中讲了一个例子:如我们想洗澡,首先我们需要去打水,然后去烧开水,而在烧开水的期间,我们可以一直等待水烧开,也可以为洗澡准备点别的,比如那个盆来,给他洗干净等,水烧开之后,我们就可以痛痛快快的去洗澡了。
这个过程中,作者强调,我们要做一个会生活的人。没有必要去一直等待水烧开,我们可以借等待的时间,做点其他的准备工作。把时间利用起来,不必在此干等着。无形中,作者也为我们学习多线程的朋友上了一课,又印证了那句老话:不会生活的人,就不会学习,果然如此。
我们来看这个例子:打水、洗澡都是串行的,也就是说我们必须亲自从头到尾完成的;而等待烧开水的期间,就可以是并行的,我们可以为洗澡做一些其他的准备工作,比如找洗盆,准备肥皂洗发水之类的东西。并行处理的也是一个异步处理过程,其实异步与并发是分不开的,异步就是并行处理,多了就是并发。
我一再强调,多线程是用来处理复杂需求问题的。尽管多线程处理的问题很复杂,但万丈高楼平地起。大家伙儿也不能一口吃成个胖子,我们还是要从基础抓起。
就像我们学习Struts一样,学会了Struts1,那么Struts2和SpringMVC我们就会感觉到很亲切,而且研究起来也没有那么复杂了。
我们学习多线程也是一样,基础的掌握了,那么JDK中封装的那些并发工具也就不再复杂了。而且业务中遇到任何一个复杂的并发需求,都是由一个个简单的相关问题组成的,掌握了基础的东西,然后再见招拆招,随机应变就可以了。
多线程的应用,也是有情况限制的。盲目的使用或者误用,不仅不能提高系统的性能,而且还会使系统的性能大打折扣。因为线程本身也要占用内存空间,大量的线程会竞相抢占内存资源,处理不当很容易造成内存溢出。同时大量的线程回收也会给GC打来很大压力,延长停顿时间。这里面涉及到了一些JVM优化以及GC回收的机制问题,有机会的话,再后文在深入介绍。
从今天开始,我会根据自己理解,讲几篇多线程的东西,希望对通路朋友有所帮助。
轻松学会多线程(一)——多线程介绍