java多线程使用不当造成的问题

   下面的thread dump是在CPU使用高的情况下采集的jstack的数据。

"pool-19-thread-50" prio=10 tid=0x00007fd1b8001000 nid=0x11bb2 runnable [0x00007fd41f018000]
   java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:79)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87)
- locked <0x0000000790724f88> (a sun.nio.ch.Util$2)
- locked <0x0000000790724f98> (a java.util.Collections$UnmodifiableSet)
- locked <0x0000000790724f40> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:98)
at weblogic.socket.NIOSocketMuxer$NIOInputStream.readInternal(NIOSocketMuxer.java:815)
at weblogic.socket.NIOSocketMuxer$NIOInputStream.read(NIOSocketMuxer.java:759)
at weblogic.socket.NIOSocketMuxer$NIOInputStream.read(NIOSocketMuxer.java:742)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
- locked <0x00000007aac27988> (a java.io.BufferedInputStream)
at weblogic.net.http.MessageHeader.isHTTP(MessageHeader.java:227)
at weblogic.net.http.MessageHeader.parseHeader(MessageHeader.java:149)
at weblogic.net.http.HttpClient.parseHTTP(HttpClient.java:514)
at weblogic.net.http.HttpURLConnection.getInputStream(HttpURLConnection.java:434)
- locked <0x00000007aac23230> (a weblogic.net.http.SOAPHttpURLConnection)
at weblogic.net.http.SOAPHttpURLConnection.getInputStream(SOAPHttpURLConnection.java:37)
at weblogic.net.http.HttpURLConnection.getResponseCode(HttpURLConnection.java:1078)
at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.getResponseCode(URLConnectionHTTPConduit.java:260)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1513)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1486)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1305)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:623)
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
- locked <0x00000007aac221c0> (a org.apache.cxf.phase.PhaseInterceptorChain)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:541)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:474)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:377)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:330)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134)
at com.sun.proxy.$Proxy270.sendWorkList(Unknown Source)
at com.comtop.soa.tbi.client.csgii.workcalendar.SOAServicePort_SOAService_Client.sendWorkList(SOAServicePort_SOAService_Client.java:67)
at com.gg.device.prodplan.plan.facade.internal.WorkCalendarFacade.sendWorkPlanDataToCSG(WorkCalendarFacade.java:176)
at com.gg.device.prodplan.plan.facade.internal.WorkCalendarFacade$$FastClassByCGLIB$$2a1fd51c.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:80)
at com.gg.monitor.MonitorAspect.aroundAllMethod(MonitorAspect.java:87)
at sun.reflect.GeneratedMethodAccessor497.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:610)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:65)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:80)
at com.comtop.sproc.core.exceptionhandler.aop.SprocFacadeExceptionAspect.doAround(SprocFacadeExceptionAspect.java:45)
at sun.reflect.GeneratedMethodAccessor493.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:610)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:65)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
at com.gg.device.prodplan.plan.facade.internal.WorkCalendarFacade$$EnhancerByCGLIB$$5dfd8226.sendWorkPlanDataToCSG(<generated>)
at com.gg.device.prodplan.controller.plan.ProdPlanInfoMulController$1.run(ProdPlanInfoMulController.java:1630)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
   Locked ownable synchronizers:
- <0x000000073808b5f0> (a java.util.concurrent.ThreadPoolExecutor$Worker)

Locked ownable synchronizers:这里值为None,说明当前线程没有处于同步块内,反之在。

查看堆栈代码,是业务代码使用了多线程,生成线程的数量的规则是查看服务器CPU空闲数量生成。而部署的规则是一台服务器上部署了10个节点,如果只是部署一个节点是可以这么干。将线程调整为2个,调整代码后,有137个下列的线程,只有37个了。

"pool-19-thread-49" prio=10 tid=0x00007fd2d0001800 nid=0x11b4e waiting on condition [0x00007fd41f11b000]

   java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for  <0x00000006f266ed20> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
- None


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第 1/27 页 Java 课程设计项目实例《基于微服务的在线签到》子系统 一、前言 作为智能考勤管理系统、会议管理系统等多种系统组成部分的"在线签到"子系统从 业务逻辑本身来看,并没有什么复杂性。不外乎是前端用户通过手机 APP、PC 电脑应用程 序或者 Web 浏览器等形式的客户端访问服务器端相关程序中的签到方法,记录用户签到的 时间等信息。但问题是如何能够让一个系统同时能够支持多种不同形式的客户端访问? "在线签到"子系统选用目前比较流行和热门的"微服务"( Microservice)作为系统 的技术实现方案,作者在本文中将重点介绍子系统所应用的核心技术——微服务、反射、 对象序列化、多线程以及基于 TIP/IP 的 Socket 通讯等,此外还通过具体的程序代码实现为 读者介绍微服务的底层实现原理、Socket 通讯编程实现。 当然,作为课程设计文档的规范格式中所必需的"系统需求"、"系统设计"和"项 目总结"等章节的内容在本文中,由于本文的篇幅关系,作者暂不涉及这些章节的内容— —本文的写作重点在"技术"和"实现"两方面。感兴趣的读者可以将本文嵌入到自己的 课程设计系统中或者引用本文相关内容, 以丰富和完善自己的课程设计、 毕业设计等文档。 二、系统所应用的核心技术——微服务 1、单体架构的应用 (1)什么是单体架构(Monolithic Architecture)的应用 在传统的软件应用开发中,基本上都是将一个软件项目相关的功能程序代码(包含有 系统的 DO/DAO,Service,UI 等所有逻辑)、资源文件、配置文件和数据库等方面的内容 打包为一个 JAR 程序包或者多个 JAR 程序包文件(当然也可能为 WAR、EAR 或其它归档 格式的文件),以这样的方式发布的应用程序,一般称为单体架构的应用。如下示例图所 示为单体架构的应用结构关系示图,单体架构的应用可以是 PC 端的应用程序,也可以是 基于浏览器的 Web 应用或者移动端的 App 应用等形式。 第 2/27 页 (2)基于单体架构的应用所体现出的主要优点 首先,便于共享和管理。由于在单个归档文件中包含所有的功能程序及相关的资源文 件,便于在团队之间以及不同的部署阶段之间共享,也方便管理。 其次,易于测试。单体应用一旦成功部署,所有的系统功能服务都能够正常地提供, 能够简化对它的测试过程。因为高度集中,没有附加的外部依赖,对单体应用的每项测试 都可以在部署完成后正常地开展。 最后,易于部署。只需要将它的单个归档文件(JAR、WAR、EAR)复制到发布的某 个系统目录中。全部的功能程序都在本地主机中或者 Web 服务器中,没有分布式的管理和 调用的消耗。 (3)基于单体架构的应用所带来的主要缺点 1)系统将会越来越臃肿 随之而来的问题将是部署效率低。因为当越来越多的程序功能模块都集中在同一项目 相关的单个归档文件(JAR、WAR、EAR)时,整个系统将会越来越庞大和变得越来越臃 肿,维护困难——对单体应用的编译打包、部署、测试的整个过程会非常耗时;系统的扩 展性也不够高:而且很难满足高并发应用环境下的业务需求。 2)系统资源无法隔离 由于在整个单体系统中的各个功能模块都依赖于同样的资源文件、系统库、内存等资 源,一旦某个功能模块对相关的资源如果使用不当,整个应用系统都有可能会崩溃。扩展 能力受限:单体应用只能作为一个整体进行扩展,无法根据业务模块的需要进行伸缩。 3)系统开发成本高 系统项目在早期开发时,由小团队的开发人员进行协作修改代码,打包部署,更新发 第 3/27 页 布等方面的事情是可控的。但是随着团队人员不断地增加,如果此时仍然还是按照早期的 方法去开发。而如果测试阶段只要在系统中有某个功能有问题,就得重新编译、打包和部 署。此外,所有的开发人员又都得参与其中,效率低下,开发成本极高。 基于单体架构的应用方式比较适合小型的项目,但是对于大型的应用项目不能再应用 单体架构,否则将使得系统的稳定性、扩展性和灵活性都很难满足要求。因此,需要分布 式的应用开发模式下的微服务架构。 2、微服务架构风格 (1)什么是微服务架构风格 微服务架构(Microservice Architecture)风格是一种将一个单一应用程序(单体程序) 开发为一组小型服务的方法,每个服务都运行在自己的进程中,服务间的通信完全可以采 用轻量级的通信机制。这些服务围绕业务能力构建并且服务可用不同的编程语言开发和使 用不同的数据存储技术。如下示例图所示为微服务架构的应用结构关系示图。 比如在某系统中有 Customer 模块和 Product 模块,但是 Customer 模块和 Product 模块 两者之间并没有直接的关系,而只是交互一些数据。因此,就可以将这两个模块分开,
Java学习题》<br><br>据说,如果你能独立完成(不用看资料,不借助调试)回答在60分以上,找个6000元以上的工作由***来给你介绍。<br><br>1.简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。(15分)<br>2.下面程序运行会发生什么结果?如果有错误,如何改正? (15分)<br>interface A{<br> int x = 0;<br>}<br>class B{<br> int x =1;<br>}<br>class C<br> extends B implements A {<br> public void pX(){<br> System.out.println(x);<br> }<br> public static void main(String[] args) {<br> new C().pX();<br> }<br>}<br>} <br>3.简述 Java Server Page 和 Servlet 的联系和区别。(20分)<br>4.XML文档定义有几种形式?它们之间有何本质区别?<br>解析XML文档有哪几种方式?(20分)<br>5.简述synchronizedjava.util.concurrent.locks.Lock的异同 ?(15分)<br>6.EJB规范规定EJB中禁止的操作有哪些?(15分)<br>最后还有一题考考你的眼力:<br>public String toString(){<br> return this + "@" + this.hashCode();<br>}<br>这个toString()方法实现有无不当的地方?(toString方法其实可以按你想输出的任何内容输出一些该类的信息)<br>以下答案供参考(不一定完全正确),也没有很详细说明.相关知识可以自己参考相关资料加上自己的理解.欢迎拍砖<br>1.简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。(15分)<br>区别主要答两点:<br>a.条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型,而且可以操作数值型<br>b.逻辑操作不会产生短路.如:<br>int a = 0;<br>int b = 0;<br>if( (a = 3) > 0 || (b = 3) > 0 ) //操后a =3,b=0.<br>if( (a = 3) > 0 | (b = 3) > 0 ) //操后a =3,b=3.<br> <br>答对第一点得5分,答对第二点得10分.<br>本题考察最最基本的知识,但仍然有很多大牛级开发人员下马,任何语言在开始的部分<br>都会详细介绍这些基本知识,但除了学习第一种语言时,没有人在学习新的语言时愿意<br>花五分钟来复习一下.<br>2.下面程序运行会发生什么结果?如果有错误,如何改正? (15分)<br>interface A{<br> int x = 0;<br>}<br>class B{<br> int x =1;<br>}<br>class C<br> extends B implements A {<br> public void pX(){<br> System.out.println(x);<br> }<br> public static void main(String[] args) {<br> new C().pX();<br> }<br>}<br>}<br>本题在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,<br>两个x都匹配,就象在同时import java.util和java.sql两个包时直接声明Date一样)<br>本题主要考察对接口和类的最最基本的结构的了解.对于父类的变量,可以用super.x来<br>明确,而接口的属性默认隐含为 public static final.所以可以通过A.x来明确.<br>3.简述 Java Server Page 和 Servlet 的联系和区别。(20分)<br>本题不用多说,在答相同点时应该明确知道jsp编译后是"类servlet"而"不是Servlet",<br>答区别时应该回答出"侧重于(视图/控制逻辑)".其它可根据情况加减分值.知识很简单,<br>但从面试的角度看,被试者不仅要能知道它们的区别,而且要能比较准确地表达出来(以<br>后写文档要能让别人看得懂,不产生歧义),回答"jsp编译后就是servlet"视为错误,回答<br>"jsp用于视图,servlet用于控制逻辑"视为错误,应该用侧重于,主要(多数)用于等词语<br>表达.<br>4.XML文档定义有几种形式?它们之间有何本质区别?<br>解析XML文档有哪几种方式?(20分)<br>本题三个答题点:<br>a: 两种形式 dtd,schema<br>b: 本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的<br>根本目的)<br>c: 两种主要方式:dom,sax.答出两种得全分,如能答出saxt,或其它(在答出dom,sax的基<br>础上,如果应试者认为其它方式也可以视为对xml的解析应该允许.但没有答出dom,sax把<br>其它方式说成是对XML的解析不得分)应该加分.<br>5.简述synchronizedjava.util.concurrent.locks.Lock的异同 ?(15分)<br>主要相同点:<br>Lock能完成synchronized所实现的所有功能.(其它不重要)<br>主要不同点:<br>Lock有比synchronized更精确的线程语义和更好的性能(在相同点中回答此点也行)<br>synchronized会自动释放锁.而Lock一定要求程序员手工释放.并且必须在finally从句<br>中释放,如果没有答出在finally中释放不得分.就如Connection没有在finally中关闭一<br>样.连最基本的资源释放都做不好,还谈什么多线程编程.<br>6.EJB规范规定EJB中禁止的操作有哪些?(15分)<br>共有8点,答出下列3-4点得满分.<br>1.不能操作线程和线程API(线程API指非线程对象的方法如notify,wait等)<br>2.不能操作awt<br>3.不能实现服务器功能<br>4.不能对静态属生存取.<br>5.不能使用IO操作直接存取文件系统<br>6.不能加载本地库.<br>7.不能将this作为变量和返回.<br>8.不能循环调用.<br>public String toString(){<br> return this + "@" + this.hashCode();<br>}<br>会变成 <br>public String toString(){<br> return String.valueOf(this) + "@" + String.valueOf(this.hashCode());<br>}<br>而valueOf方法又将去调用toString();<br>/**<br> public static String valueOf(Object obj) {<br>return (obj == null) ? "null" : obj.toString();<br> }<br>*/<br>toString唯一就是不要递归其它你可以输出任何内容。<br><br><br>你能做对几道?(如果错了能说出其正确的说法吗)<br>是非题:<br>1.所谓缺省构造函数就是没有参数的构造函数<br>2.Java 的char是8位的<br>3.一个Java类可以有多个父类,这称作多继承.<br>4.对象成员变量在对象创建时会获得一个缺省的初始值.<br>5.Java数组随时可以改变大小.<br>6.InputStream和OutputStream读写的数据是8位的.<br>7.Java是强类型语言.<br>8.Java没有指针,引用不能等同于指针.<br>9.protected的成员只能被继承类成员存取.<br>10. 任何的Applet都完全不能访问本地资源.<br>11. String是基本数据类型吗?<br>12. Anonymous Inner Class (匿名内部类) 可以extends(继承)其它类<br>13 final类是为防止他人从你的类上派生新类,此类是不可继承的。<br>14 super()和this()方法只能在构造函数里调用.<br>15 方法的参数变量不能是final的<br>16 接口的所有方法默认都是public,abstract和non-static的<br>17 接口可以声明成final<br>18 内部类可以访问外层类的任何变量,包括私有的<br>19 匿名类可以有构造器,声明时候不能带参数<br>20 抽象方法可以是static的。<br>21 构造器没有任何返回类型,哪怕是void也不行。<br>22 只要类中显式地定义一个,那么Java不会再为你定义一个默认的构造器<br>23 构造方法可以被继承。<br>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值