//==采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求。
//==服务器端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.*;
import java.util.concurrent.*;
public class MultiThreadServer {
private int port=8821;
private ServerSocket serverSocket;
private ExecutorService executorService;//线程池
private final int POOL_SIZE=10;//单个CPU线程池大小
public MultiThreadServer() throws IOException{
serverSocket=new ServerSocket(port);
//Runtime的availableProcessor()方法返回当前系统的CPU数目.
executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
System.out.println("服务器启动");
}
public void service(){
while(true){
Socket socket=null;
try {
//接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
socket=serverSocket.accept();
executorService.execute(new Handler(socket));
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
new MultiThreadServer().service();
}
}
class Handler implements Runnable{
private Socket socket;
public Handler(Socket socket){
this.socket=socket;
}
private PrintWriter getWriter(Socket socket) throws IOException{
OutputStream socketOut=socket.getOutputStream();
return new PrintWriter(socketOut,true);
}
private BufferedReader getReader(Socket socket) throws IOException{
InputStream socketIn=socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public String echo(String msg){
return "echo:"+msg;
}
public void run(){
try {
System.out.println("New connection accepted "+socket.getInetAddress()+":"+socket.getPort());
BufferedReader br=getReader(socket);
PrintWriter pw=getWriter(socket);
String msg=null;
while((msg=br.readLine())!=null){
System.out.println(msg);
pw.println(echo(msg));
if(msg.equals("bye"))
break;
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(socket!=null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//==客户端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MultiThreadClient {
public static void main(String[] args) {
int numTasks = 10;
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < numTasks; i++) {
exec.execute(createTask(i));
}
}
// 定义一个简单的任务
private static Runnable createTask(final int taskID) {
return new Runnable() {
private Socket socket = null;
private int port=8821;
public void run() {
System.out.println("Task " + taskID + ":start");
try {
socket = new Socket("localhost", port);
// 发送关闭命令
OutputStream socketOut = socket.getOutputStream();
socketOut.write("shutdown/r/n".getBytes());
// 接收服务器的反馈
BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream()));
String msg = null;
while ((msg = br.readLine()) != null)
System.out.println(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
};
}
}

Java ExecutorService 线程池相关推荐

  1. Java并发—线程池ThreadPoolExecutor基本总结

    原文作者:Matrix海子 原文地址:Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线 ...

  2. Java中线程池,你真的会用吗

    转载自   Java中线程池,你真的会用吗 在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理. 在文中有这样一段描述: 可以通过Ex ...

  3. 自定义java线程池_我的Java自定义线程池执行器

    自定义java线程池 ThreadPoolExecutor是Java并发api添加的一项功能,可以有效地维护和重用线程,因此我们的程序不必担心创建和销毁线程,也不必关注核心功能. 我创建了一个自定义线 ...

  4. 我的Java自定义线程池执行器

    ThreadPoolExecutor是Java并发api添加的一项功能,可以有效地维护和重用线程,因此我们的程序不必担心创建和销毁线程,而将精力放在核心功能上. 我创建了一个自定义线程池执行程序,以更 ...

  5. java中线程池的几种实现方式

    1.线程池简介:     多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.         假设一个服务器完成一项任务所需时间为:T1 ...

  6. Java中线程池,你真的会用吗?

    在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理. 在文中有这样一段描述: 可以通过Executors静态工厂构建线程池,但一般不建 ...

  7. java异步线程池同时请求多个接口数据

    java异步线程池同时请求多个接口数据 一.适合的使用场景 复杂的网页爬虫,如要同时请求多个不同网页的数据,并且需要执行不同的数据处理,这个是非常合适的,执行线程传递的参数到最后callback是会附 ...

  8. [转]深入理解Java之线程池

    原文链接 原文出处: 海 子 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这 ...

  9. Java 监控线程池所有任务是否执行完毕

    Java 监控线程池所有任务是否执行完毕 场景引入 在最近的工作中遇到一个需要批量生产百万数据并写入数据库的需求,先通过单线程的方式去实现,但是感觉效率一般,然后通过多线程的方式去改进,但是遇到下面的 ...

最新文章

  1. 1096 Consecutive Factors
  2. MySQL CPU 使用率高的原因和解决方法
  3. [转] log4j-over-slf4j与slf4j-log4j12共存stack overflow异常分析
  4. LDAP 中 CN, OU, DC 的含义
  5. LeetCode LCS 03. 主题空间(广度优先搜索BFS)
  6. sql 插入多行数据的问题
  7. Vue-CLI 3.x 自动部署项目至服务器
  8. 数据结构实验 5.二叉树深度
  9. Use AVAudioPlayer in OperationQueue
  10. Response.Redirect在新窗口打开
  11. 哔哩哔哩---P2 WPF基础入门视频(布局)
  12. 计算机考试表格中的透视图怎么弄,职称计算机考试:创建数据透视表
  13. 学生个人网页设计作品 HTML+CSS 简单个人主页成品 HTML学生个人网站作业设计
  14. 【MATLAB】遗传算法(GA)求解TSP问题
  15. 成就系统实现(三)-架构设计
  16. delphi xe 解析复杂json
  17. 数学软件Matlab、Mathematica、Maple、Mathcad、SAS、SPSS、Lindo
  18. flume读取kafka写hive
  19. 计算机组成原理课程设计总结,计算机组成原理课程设计的实验报告
  20. Unity Transform与Hierachy

热门文章

  1. WebRTC 那些常用的缩略词以及部分知识杂谈
  2. 协程库st(state threads library)原理解析
  3. 使用Systemd包装SpringBoot应用
  4. SpringMVC Spring Mybatis Druid SpringSession集成例子
  5. redis反杀面试官之10问
  6. 手绘风格的数据可视化 (萌萌风)Sketchify,及其他可视化工具(商业风)
  7. 【PAT甲级 删除字符串中的指定字符】1050 String Subtraction (20 分) C++
  8. ACM练习 校赛183F:公平的游戏(TLE)【set的使用,给迭代器增加指定偏移量】
  9. 同步类的基础AbstractQueuedSynchronizer(AQS)
  10. 算法训练营08-分治和回溯