转载标明出处:http://blog.csdn.net/lmj623565791/article/details/26938985

继续并发,貌似并发的文章非常少有人看啊~哈~

今天准备具体介绍java并发包下的Executor,以及Java提供了非常多灵活的且极其方便的线程池的创建。

嗯。那就慢慢说,大家肯定都学过Socket,JavaSe的时候写聊天程序,游戏的server。以及Android程序自己须要提供server的。都会拿Socket来自己写个:

最初我们的server可能写成这样:

1、单线程server
package com.zhy.concurrency.executors;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; /**
* 单线程Webserver
*
* @author zhy
*
*/
public class SingleThreadWebServer
{ public static void main(String[] args) throws IOException
{ ServerSocket server = new ServerSocket(7711);
while (true)
{
Socket client = server.accept();
handleReq(client);
} } /**
* 处理请求
* @param client
*/
private static void handleReq(Socket client)
{
} }

这种server代码非常easy,理论上也是正确的,可是在实现的环境中却非常糟糕,由于它每次仅仅能处理一个请求。假设每一个请求的耗时过长,后面的请求会长时间等待或者超时错误。

于是乎,出现了以下这种写法:

2、每一个请求分配一个线程的server
package com.zhy.concurrency.executors;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 为每一个请求分配一个线程
* @author zhy
*
*/
public class TaskPreThreadServer
{
public static void main(String[] args) throws IOException
{
ServerSocket server = new ServerSocket(8811);
while (true)
{
final Socket client = server.accept();
new Thread()
{
public void run()
{
handleReq(client);
};
}.start();
}
} protected static void handleReq(Socket client)
{ }
}

为每一个请求开辟一个线程,首先我得承认我也经经常使用这种写法~可是我们还是要吐槽下这样写法的不足:

a、线程的生命周期的开销还是相当高的,大量的线程的创建将消耗大量的计算机资源

b、可创建线程的数量存在一个限制值(这个值由平台认为,且受非常多因素的制约),假设超过这个限制,可能会报OOM错误

c、在一定范围内。添加线程能够提高系统吞吐量,可是超过了这个范围。就物极必反了,仅仅会减少程序的运行速度。

所以我们要继续改进我们的server代码,Executor提供了非常方便的方式:

3、基于Executor的server
package com.zhy.concurrency.executors;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors; /**
* 基于Executor的server
* @author zhy
*
*/
public class TaskExecutionServer
{
private static final int THREAD_COUNT = 100;
private static final Executor exec = Executors
.newFixedThreadPool(THREAD_COUNT); public static void main(String[] args) throws IOException
{
ServerSocket server = new ServerSocket(9911);
while (true)
{
final Socket client = server.accept();
Runnable task = new Runnable()
{
@Override
public void run()
{
handleReq(client);
}
};
exec.execute(task);
} } protected static void handleReq(Socket client)
{ }
}

创建一个固定长度的线程池,既攻克了单线程的堵塞问题。也攻克了无限创建线程带来的内存消耗过多等问题。

4、Executors的API介绍

Java类库提供了很多静态方法来创建一个线程池:

a、newFixedThreadPool 创建一个固定长度的线程池。当到达线程最大数量时,线程池的规模将不再变化。

b、newCachedThreadPool 创建一个可缓存的线程池。假设当前线程池的规模超出了处理需求,将回收空的线程。当需求添加时。会添加线程数量;线程池规模无限制。

c、newSingleThreadPoolExecutor 创建一个单线程的Executor,确保任务对了,串行运行

d、newScheduledThreadPool 创建一个固定长度的线程池。并且以延迟或者定时的方式来运行。相似Timer;后面后单独使用Blog介绍它与Timer差别

小结一下:在线程池中运行任务比为每一个任务分配一个线程优势很多其它,通过重用现有的线程而不是创建新线程,能够在处理多个请求时分摊线程创建和销毁产生的巨大的开销。

当请求到达时,通常工作线程已经存在,提高了响应性。通过配置线程池的大小,能够创建足够多的线程使CPU达到忙碌状态,还能够防止线程太多耗尽计算机的资源。

好了,结束~欢迎大家留言~

Java 并发专题 : Executor具体介绍 打造基于Executor的Webserver的更多相关文章

  1. Java 并发专题 : Executor详细介绍 打造基于Executor的Web服务器

    转载标明出处:http://blog.csdn.net/lmj623565791/article/details/26938985 继续并发,貌似并发的文章很少有人看啊~哈~ 今天准备详细介绍java ...

  2. Java 并发和多线程(一) Java并发性和多线程介绍[转]

    作者:Jakob Jenkov 译者:Simon-SZ  校对:方腾飞 http://tutorials.jenkov.com/java-concurrency/index.html 在过去单CPU时 ...

  3. Java并发性和多线程介绍

    java并发性和多线程介绍: 单个程序内运行多个线程,多任务并发运行 多线程优点: 高效运行,多组件并行.读->操作->写: 程序设计的简单性,遇到多问题,多开线程就好: 快速响应,异步式 ...

  4. Java 并发专题 : CyclicBarrier 打造一个安全的门禁系统

    继续并发专题~ 这次介绍CyclicBarrier:看一眼API的注释: /** * A synchronization aid that allows a set of threads to all ...

  5. Java并发专题

    ——参考于码农求职小助手公众号 1.并行和并发有什么区别? 1. 并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔发生: 2. 并行是在不同实体上的多个事件,并发是在同一 ...

  6. Java 并发专题 :FutureTask 实现预加载数据 在线看电子书、浏览器浏览网页等

    继续并发专题~ FutureTask 有点类似Runnable,都可以通过Thread来启动,不过FutureTask可以返回执行完毕的数据,并且FutureTask的get方法支持阻塞. 由于:Fu ...

  7. Java 并发专题 : Semaphore 实现 互斥 与 连接池

    继续并发方面的知识.今天介绍Semaphore,同样在java.util.concurrent包下. 本来准备通过例子,从自己实现到最后使用并发工具实现,但是貌似效果并不是很好,有点太啰嗦的感觉,所有 ...

  8. Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭

    最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆. 每天起早贪黑的上班,父母每天也要上班,话说今天定了个饭店,一家人一起吃个饭,通知大家下班去饭店集合.假设:3个人 ...

  9. Java 并发专题 : Timer的缺陷 用ScheduledExecutorService替代

    继续并发,上篇博客对于ScheduledThreadPoolExecutor没有进行介绍,说过会和Timer一直单独写一篇Blog. 1.Timer管理延时任务的缺陷 a.以前在项目中也经常使用定时器 ...

随机推荐

  1. ⑥bootstrap表单使用基础案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. MSBuild Tools解决办法

    每次在CI上通过Msbuild做发布,基本都会碰到下面的问题 error MSB4019: 未找到导入的项目"C:\Program Files (x86)\MSBuild\Microsoft ...

  3. Java 内存区域划分 备忘录

    最近看了<深入理解虚拟机>的内存分配与管理这部分的内容,这里做一个的总结,以加深我对知识点的理解,如有错误的地方,还望大神们指出,我及时更正:  内存区域划分 首先是下面这幅图: 图 1. ...

  4. 用大白话扯扯那"神奇"的面向对象编程思维(一)

    前言: 每当提到面向对象的时候,初学者肯定都是一脸懵逼的状态,到底什么是面向对象?会用面向对象后有什么牛逼之处吗?不会用是不是就会死掉?答案肯定不会死掉,我们可以来简单的举一 个栗子 1.当你想到熊猫 ...

  5. js 切换全屏

    公司有一个需求就是点击某一个按钮实现全屏切换功能,然后呢我就在网上扒了段代码.封装了一下.使用的小伙伴们可以看看哦! 切换全屏代码 <!DOCTYPE html> <html> ...

  6. for循环中执行setTimeout问题

    代码片段: for(var i=0;i<8;i++){ setTimeout(function () { console.log(i) },0) } 输出了8次8,这跟js的执行顺序和作用域链有 ...

  7. sql2012笔记

    收缩数据库日志文件1.数据库右键-->Options-->Revovery model =Full 改成 Simple2.数据库右键-->Tasks-->Shrink--> ...

  8. OGEngine_2.x中BitmapFont加载后黑屏问题的解决办法

    在我使用OGEngine_2.x进行消灭圈圈(星星)游戏的实践的时候,使用BitmapFont对自定义字体进行调用. 原文字体教程如下:http://blog.csdn.net/OrangeGame/ ...

  9. 设计模式的征途—7.适配器(Adapter)模式

    在现实生活中,我们的笔记本电脑的工作电压大多数都是20V,而我国的家庭用电是220V,如何让20V的笔记本电脑能够工作在220V的电压下工作?答案:引入一个电源适配器,俗称变压器,有了这个电源适配器, ...

  10. CSS-笔记1-选择器与文本元素

    知识点一: CSS概念:CSS 指层叠样式表 (Cascading Style Sheets)(级联样式表) Css是用来美化html标签的,相当于页面化妆. 知识点二: 选择器格式与部分属性: 写法 ...