论坛首页 编程语言技术论坛

高手问答:Java多线程编程实战指南(设计模式篇)--获奖名单公布

浏览 14732 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2015-11-23   最后修改:2015-12-02
随着CPU 多核时代的到来,多线程编程在充分利用计算资源、提高软件服务质量方面扮演了越来越重要的角色。而解决多线程编程中频繁出现的普遍问题可以借鉴设计模式所提供的现成解决方案。虽然传统的SSH(特指Struts+Spring+Hibernate)依然还在发挥着重要的作用,但不得不说的是,作为一名有追求的Java 开发者,眼光不应该局限于此。每一名有理想的Java 开发者都应该系统学习有关多线程编程的知识,这不仅涉及程序语言与库的学习,还需要了解现代硬件体系架构(如CPU、缓存、内存等),同时辅以恰当的设计模式,这样才能在未来游刃有余、得心应手。

本期特邀《Java多线程编程实战指南(设计模式篇)》作者:黄文海(论坛ID: viscent), 针对Java多线程编程问题给予大家解答,欢迎网友积极提问,与专家一起讨论!

作者简介:




黄文海,2004年开始从事软件开发工作,近几年从事软件项目管理工作。在其工作过程中积累了丰富的技术指导经验和企业内部培训经验。曾在InfoQ中文站和IBM developerWorks上发表过十几篇技术、项目管理文章。

作者博客:http://viscent.iteye.com/


欢迎大家在活动时间内就Java方面问题在本帖集中向黄文海ID: viscent提问,期间专家会对每一个问题认真进行答复。

活动时间:2015-11-23~~11-30

活动结束后将会抽取5名会员赠送《Java多线程编程实战指南(设计模式篇)》一本




图书试读下载:http://dl2.iteye.com/upload/attachment/0113/2406/afbd8d53-dcad-3afc-8d78-41c15915b64c.pdf

图书购买链接:http://item.jd.com/11785190.html

===============================================================
获奖名单公布 


string2020、随便小屋、 tenght、fqg05、 肖泽文

请以上用户于2015.12.10之前将您的姓名、电话、邮寄地址通过发送站内信给ITeye管理员或者直接发邮件至webmaster@iteye.com,逾期视为自动放弃奖品哦。
  • 大小: 24.4 KB
  • 大小: 20.5 KB
  • 大小: 21.6 KB
   发表时间:2015-11-23   最后修改:2015-11-23
使用多线程有很多好处,但是任何事情都不是绝对的。
请问,什么情况下不适合用多线程(除了单核CPU),或者说,多线程会带来哪些副作用
1 请登录后投票
   发表时间:2015-11-23  
使用java多线程时,一般都会使用线程池, 固定大小,cache线程池各有什么优缺点?

固定大小线程池大小怎么计算获取?
0 请登录后投票
   发表时间:2015-11-23   最后修改:2015-11-23
这实际上是一个收益与成本比的问题。因为多线程也有自身的开销和问题,如上下文切换、锁的开销以及由锁可能导致的死锁等问题,所以使用多线程编程不一定就比使用单线程的处理效率更高。这正如书中所打的一个比方---和尚打水的故事:一个和尚(单线程)挑水喝,两个和尚(多线程)担水喝,三个和尚(多线程)没水喝。可见,多线程的使用可能反而导致处理效率的降低。本书第1章对这个问题有讲解。如何恰当地使用多线程编程,这点也正是本书所能起到的一个作用。

另一方面,在任务原始规模比较大(或者说不小)的情况下,恰当地使用多线程可以提高处理效率。例如,本书第13章提到的一个实战案例:将数据库中的几十万条数据导出到文件中并发送到指定的FTP服务器上。这个实例如果不采用多线程编程,则可能使相应的计算显得非常慢。

特意地使用单线程编程有时反而可能提高处理效率。这里,典型的使用场景是程序的处理过程涉及一些独占资源或者非线程安全的对象。例如,本书第11章的实战案例:使用非线程安全的FTP客户端组件将一批本地文件FTP上传到指定的多个服务器。这个案例中,我们使用了单线程处理FTP文件上传,以减少多线程相关的开销。而这个线程的实际处理效率也能满足我们实际的需要。

Java平台本身就是个多线程的平台,Java平台中线程无处不在:负责Java程序运行的main线程、垃圾回收GC线程、JIT编译器线程。因此,这里我们所说的单线程编程实际上是在多线程环境中特意使用单线程。

另外,即使是在单CPU的机器上,多线程编程也是有适用场景的。例如,一个线程正在执行I/O操作(如读取文件),此时该线程并不占用CPU(因为它已经被Switch out了),那么其它线程,如执行加密/解密计算的线程此时可以占用CPU执行。这样,便提高了CPU的利用率,有利于提高系统的吞吐率
0 请登录后投票
   发表时间:2015-11-23  
我们知道Java多线程编程是非常复杂的,包括创建线程,以及对多个线程进行调度、管理等等,而且线程切换开销会带来多线程程序的低效性,那么问题来了,我们是否需要多线程?何时(或者何种情况下)需要多线程?
谢谢
0 请登录后投票
   发表时间:2015-11-23   最后修改:2015-11-23
tenght 写道
我们知道Java多线程编程是非常复杂的,包括创建线程,以及对多个线程进行调度、管理等等,而且线程切换开销会带来多线程程序的低效性,那么问题来了,我们是否需要多线程?何时(或者何种情况下)需要多线程?
谢谢


正如上面的一个回复中提到的,“多线程”还是“单线程”是个权衡收益和成本的。
如果使用多线程会导致巨大的上下文切换等成本时,那不妨考虑单线程(当然,是指多线程环境下的单线程)。
上面的回复也指出了多线程的2个应用场景(参见标红的部分文字)。
有关这个话题的进一步信息,可以看本书第11页。
1 请登录后投票
   发表时间:2015-11-23  

viscent 你好,现在网上有很多关于Java多线程的资料,我也看过一些,但是现在仅仅懂了一些基础的原理,几乎自己在写程序的时候都没用过。我看过你的一些简介,曾经参与过很多项目。你能不能举出一些现在大家熟知的一些例子或者一些开源的项目中包含您所编写的《Java多线程编程实战指南(设计模式篇)》中包含的设计模式,让我们学习一下。我个人感觉如果单纯的学一个理论或者一些理论基础的例子,但从来都不在实际项目中运用,达不到学以致用的目的。更或者说如果您如果有时间的话可以带大家做个开源的项目,把你在书中说涉及到的设计模式运用到里面岂不更好?多谢!!!

0 请登录后投票
   发表时间:2015-11-23  
empireghost 写道
使用java多线程时,一般都会使用线程池, 固定大小,cache线程池各有什么优缺点?

固定大小线程池大小怎么计算获取?

线程池的大小设置一般要考虑到主机的CPU个数(逻辑CPU个数,NCPU)。线程池大小设置过小会导致CPU资源浪费,而设置过大则可能导致消耗过多的内存以及产生更多的上下文切换(导致CPU额外消耗过多)。粗略地说,对于执行CPU密集型的任务(如加密/解密)的线程池其最大大小可以为2NCPU。对于执行I/O密集型的任务(如写日志文件)的线程池其最大大小可以设置为2NCPU+1。详情参见本书第9章

Java中我们可以使用Runtime.getRuntime().availableProcessors()来获取主机的CPU个数。

”cache线程池“”适合于处理被提交的任务总是可以在相对短的时间内被处理完毕(成功或者失败)。而不适合处理那种在极端情况下需要长时间等待外部资源(如远程服务器)响应的任务。因为提交给这种线程池的这种任务多的情况,线程池内的线程不够用的情况下,新的线程会不断地被创建,导致线程池内的总线程数远大于CPU个数。最后,由于线程数过多,JVM的内存消耗变大,使得GC回收的消耗变大,上下文切换过多也导致CPU消耗过大,整个JVM可能处于那种“动不了”的状况。

简而言之,”cache线程池“”的优点是可以充分利用CPU资源,缺点是应对一些极端情况的能力欠缺,可能导致最终创建的线程数过多而导致系统缓慢

相反,上面所说的”cache线程池“”不适合处理的任务,固定大小的线程可以处理。这种线程池中的某些线程由于其处理的任务长时间等待外部资源响应而无法被复用,最导致所有线程都在等待情况下,新提交的任务可以等待其中的一个线程处理完毕来获得一个对其进行处理的新的线程。因此,这种线程池相对安全一定

简而言之,固定大小的线程池的有点是能够应对任务的极端情况,相对安全。缺点是,它可能导致无法充分CPU资源(与设置线程池的最大大小有关)。
0 请登录后投票
   发表时间:2015-11-23   最后修改:2015-11-23
随便小屋 写道

viscent 你好,现在网上有很多关于Java多线程的资料,我也看过一些,但是现在仅仅懂了一些基础的原理,几乎自己在写程序的时候都没用过。我看过你的一些简介,曾经参与过很多项目。你能不能举出一些现在大家熟知的一些例子或者一些开源的项目中包含您所编写的《Java多线程编程实战指南(设计模式篇)》中包含的设计模式,让我们学习一下。我个人感觉如果单纯的学一个理论或者一些理论基础的例子,但从来都不在实际项目中运用,达不到学以致用的目的。更或者说如果您如果有时间的话可以带大家做个开源的项目,把你在书中说涉及到的设计模式运用到里面岂不更好?多谢!!!

非常赞同你说的“学以致用”。这也是我在书中采用实战案例的一个原因,就是希望能够缩小“学”和“用”之间的差距或者说差异。

本书中的每个设计模式的讲解中都会包含一个叫“Java标准库实例”的小节,它就是用来介绍Java标准库的API设计用到了哪些本书收录的设计模式。

至于一些开源项目中用到的本书收录的设计模式,要完整的列出来可能要花大时间。这里,我举个例子。Java Actor库AKKA的Typed Actor就使用了本书收录的Active Object模式。网络编程框架Netty就使用本书收录的Pipeline模式。在本书的后续版本中我可能会增加这部分内容。

你提的做开源项目的想法很好。如果我后面想到好的方向,大家也可以参与进来一起做。可以关注下本书的配套源码的GitHub网站:https://github.com/Viscent/javamtp

 

0 请登录后投票
   发表时间:2015-11-23  
请问有没有一个比较通俗易懂的例子来解释多线程的概念?谢谢!
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics