import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.*; public class ThreadEchoServer {
public static void main(String[] args) {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 3,
300, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1),
Executors.defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy());
try(ServerSocket s = new ServerSocket(8189)){
while(true){
Socket incoming = s.accept();
Runnable r = new ThreadedEchoHandler(incoming);
System.out.println("当前线程池大小:"+threadPoolExecutor.getPoolSize());
System.out.println("阻塞队列容量:"+threadPoolExecutor.getQueue().size());
threadPoolExecutor.execute(r);
}
}catch (IOException e){
e.printStackTrace();
}
}
}
class ThreadedEchoHandler implements Runnable{ private Socket incoming; public ThreadedEchoHandler(Socket incomingSocket){
incoming = incomingSocket;
}
@Override
public void run() {
try(InputStream inStream = incoming.getInputStream();
OutputStream outStream = incoming.getOutputStream())
{
Scanner in = new Scanner(inStream, "UTF-8");
PrintWriter out = new PrintWriter(new OutputStreamWriter(outStream, "UTF-8"), true);
out.println("hello!, enter BYE to exit");
boolean done = false;
while(!done && in.hasNextLine()){
String line = in.nextLine();
out.println("Echo: " + line);
if(line.trim().equals("BYE"))
done = true;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

可以看到依次打开四个窗口,输入命令telnet localhost 8189,其中第三个连接被阻塞了。原因是设置的线程池核心线程数为2,最大线程数为3,阻塞队列的大小为1.

当线程数大于核心线程数,且阻塞队列不满时,新提交的线程会进入阻塞队列中。

如果新提交一个任务,阻塞队列已满,且小于最大线程数,线程池会新建线程来执行。

可以看到当第一个线程任务执行完毕后,第三个打开的窗口连接到了服务端,也就是开始执行阻塞队列中的任务了。

也算是复习了一下线程池的一些参数了

使用线程池实现为多个客户端提供Echo服务的更多相关文章

  1. gsoap:实现线程池处理时获取到客户端的ip

    问题: 在使用线程池处理客户端请求时发现不能获取到客户端的ip! 原因:     由于在server_loop注循环中只把连接字sock加到queue队列中,并没有客户端IP,所以每一次queue回调 ...

  2. io流+网络+线程池 实现简单的多客户端与服务器端通信

    1 import java.io.IOException; 2 import java.io.InputStream; 3 import java.io.OutputStream; 4 import ...

  3. JDK 伪异步编程(线程池)

    伪异步IO编程 BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端连接.在高性能服务器应用领域,往往需要面向成千上万个客户 ...

  4. 浅谈线程池(中):独立线程池的作用及IO线程池

    原文地址:http://blog.zhaojie.me/2009/07/thread-pool-2-dedicate-pool-and-io-pool.html 在上一篇文章中,我们简单讨论了线程池的 ...

  5. JDFS:一款分布式文件管理实用程序第一篇(线程池、epoll、上传、下载)

    一 前言 截止目前,笔者在博客园上面已经发表了3篇关于网络下载的文章,这三篇博客实现了基于socket的http多线程远程断点下载实用程序.笔者打算在此基础上开发出一款分布式文件管理实用程序,截止目前 ...

  6. Dubbo学习笔记8:Dubbo的线程模型与线程池策略

    Dubbo默认的底层网络通讯使用的是Netty,服务提供方NettyServer使用两级线程池,其中 EventLoopGroup(boss) 主要用来接受客户端的链接请求,并把接受的请求分发给 Ev ...

  7. 第三十八天 GIL 进程池与线程池

    今日内容: 1.GIL 全局解释器锁 2.Cpython解释器并发效率验证 3.线程互斥锁和GIL对比 4.进程池与线程池 一.全局解释器锁 1.GIL:全局解释器锁 GIL本质就是一把互斥锁,是夹在 ...

  8. ThreadPoolExecutor 线程池浅析

    作为Executor框架中最核心的类,ThreadPoolExecutor代表着鼎鼎大名的线程池,它给了我们足够的理由来弄清楚它. 下面我们就通过源码来一步一步弄清楚它. 内部状态 线程有五种状态:新 ...

  9. Java并发(二十一):线程池实现原理

    一.总览 线程池类ThreadPoolExecutor的相关类需要先了解: (图片来自:https://javadoop.com/post/java-thread-pool#%E6%80%BB%E8% ...

  10. 【Networking】(转)一个非常好的epoll+线程池服务器Demo

    (转)一个非常好的epoll+线程池服务器Demo Reply 转载自:http://zhangyafeikimi.javaeye.com/blog/285193 [cpp] /** 张亚霏修改 文件 ...

随机推荐

  1. DC-1渗透靶场实战速通版

    "感谢您阅读本篇博客!如果您觉得本文对您有所帮助或启发,请不吝点赞和分享给更多的朋友.您的支持是我持续创作的动力,也欢迎留言交流,让我们一起探讨技术,共同成长!谢谢!" 文章为速通 ...

  2. TiDB、OceanBase、PolarDB-X、CockroachDB二级索引写入性能测评

    简介: 二级索引是关系型数据库相较于NoSQL数据库的一个关键差异.二级索引必须是强一致的,因此索引的写入需要与主键的写入放在一个事务当中,事务的性能是二级索引性能的基础.本次测试将重点关注不同分布式 ...

  3. 使用MQTT与函数计算做热力图的实践

    简介: 在各类场景中,关于上报数据的处理无处不在,而以上提到的场景都可以通过本方案的MQTT+FC+API Gateway的方式参考优化来实现. 前言 最近几年,我们在一些商场.图书馆.机场或港口环境 ...

  4. [JDBC] Kettle on MaxCompute 使用指南

    简介: Kettle是一款开源的ETL工具,纯Java实现,可以在Windows.Unix和Linux上运行,提供图形化的操作界面,可以通过拖拽控件的方式,方便地定义数据传输的拓扑 .基本讲介绍基于K ...

  5. SQL server 查看脚本

    原文出处:http://blog.csdn.net/xiaochunyong/article/details/7455051 --Siuon --查看存储过程源码 create procedure m ...

  6. 高性能消息中间件-Nats使用

    一.Nats简介 官网:https://nats.io/ 官网下载:https://nats.io/download/ github:https://github.com/nats-io/nats-s ...

  7. ruby和glang的md5和sha1加密对比

    ruby和glang的md5和sha1加密对比 package main import ( "crypto/md5" "crypto/sha1" "f ...

  8. OpenVoiceV2本地部署教程,苹果MacOs部署流程,声音响度统一,文字转语音,TTS

    最近OpenVoice项目更新了V2版本,新的模型对于中文推理更加友好,音色也得到了一定的提升,本次分享一下如何在苹果的MacOs系统中本地部署OpenVoice的V2版本. 首先下载OpenVoic ...

  9. Win10-常用cmd命令与快捷键

    以下全部是本人私认为平时经常用到的指令,持续更行中- 常用快捷键 win + R : 输入cmd回车,打开命令提示符界面 win + E : 打开文件资源管理器(俗称:文件夹) win + S : 搜 ...

  10. pageoffice6 实现提取数据区域为子文件(Word拆分)

    在实际的开发过程中,有时会遇到希望提取Word文档中部分内容保存为子文件的需求,PageOffice支持提取Word文档数据区域中的内容为一个Word文件流,在服务器端创建PageOffice的Wor ...