欢迎来到天天文库
浏览记录
ID:30920655
大小:72.00 KB
页数:9页
时间:2019-01-04
《线程池调整真的很重要-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、线程池调整真的很重要-编程开发技术线程池调整真的很重要木文由ImportNew-justyoung翻译自blog.bramp.neto欢迎加入翻译小组。转载请见文末要求。知道吗,你的Javaweb应用其实是使用线程池來处理请求的。这一实现细节被许多人忽略,但是你迟早都需要理解线程池如何使用,以及如何正确地根据应用调整线程池配置。这篇文章的目的是为了解释线程模型——什么是线程池、以及怎样正确地配置线程池。单线程模型让我们从一些基础的线程模型开始,然后再随着线程模型的演变进行更深一步的学习。你使用的任何
2、应用服务器或框架,如Tomcat、Dropwizard>Jetty等,它们的基木原理其实是相同的。Web服务器的最底层实际上是一个socketo这个socket监听并接受到达的TCP连接。一旦一个连接被建立,就可以通过这个新建立的连接读取、解析信息,然后将这些信息包装成一个IITTP请求。这个I1TTP请求还将被移交至web应用程序,来完成请求的动作。我们将通过一个简单的服务器程序来展示线程在其中所起到的作用。这个服务器程序展示了大部分应用服务器的底层实现细节。让我们以一个简单•的单•线程web服务
3、器程序开始,它的代码像下面这样:ScrvcrSockctlistcncr=newScrvcrSockct(8080);try{while(true){Socketsocket二1istener.accept();try{handlcRcqucst(socket);}catch(lOExceptione){e.printStackTrace();}}}finally{listener.close();}这段代码在8080端口上创建了一个ServerSocket,紧接着通过循环來监听和接受新到达的连接。
4、一旦连接建立,会将socket传递给handleRequest方法。这个方法可能会读取该IITTP请求,处理这个请求,然后写回一个响应。在这个简单的例子屮,handleRequest方法从socket屮读取简单的一行数据,然后返回一个简短的HTTP响应。但是,handleRequest冇可能需要处理一些更复杂的任务,例如读数据库或者执行其它一些10操作。finalstaticStringresponse-"IITTP/l.02000Krn〃+"Content-type:text/plainrnz,+
5、〃〃rn+“HelloWorldrn,z;publicstaticvoidhandleRequest(Socketsocket)throwsIOException{//Readtheinputstream,andreturn〃2000K〃try{BufferedReaderin二newBufferedReader(newInputStreamReader(socket,getlnputStream()));log.info(in.readLineO);OutputStreamout二socket.g
6、etOutputStream();out.write(response.getBytes(StandardCharsets.UTF_8));}fineilly{socket.closeO;}}因为只有一个线程处理所有的socket,因此只有在完全处理好一个请求后,才能再接受下一个请求。在实际的应用中,handleRequest方法口J能需要经过100毫秒才能返回,那么这个服务器程序在一秒中,只能按顺序处理10个请求。多线程模型尽管handleRequesI可能会被10操作阻塞,CPU却可能是空闲的,
7、它可以处理其它更多请求,但这对单线程模型來说是不能实现的。I大I此,通过创建多个线程,可以使服务器程序实现并发操作:publicstaticclassHandleRequestRurrnableimplementsRurrnable{finalSocketsocket;publicHandleRequestRurrnable(Socketsocket){this.socket二socket;}publicvoidrun(){try{handleRequest(socket);}catch(IOExc
8、eptione){e.printStackTrace();}}}//MainloophereServerSocket1istener二newServerSocket(8080);try{while(true){Socketsocket=listener.accept。;newThread(newHandleRequestRunnable(socket)).start();}}finally{listenet,close();}上面这段代码中,accept0方法仍然是在
此文档下载收益归作者所有