`

ExecutorService来进行线程池的方式实现多线程

    博客分类:
  • Java
阅读更多

ExecutorService来进行线程池的方式实现多线程

 采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求.

1.服务端

package sterning;

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();
}
}
}
}
2.客户端
package sterning;

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();
}
}

};
}
}

  从而实现了多个客户端向服务器端发送请求,服务器端采用多线程的方式来处理的情况.
分享到:
评论

相关推荐

    线程池管理多线程上传

    总结来说,线程池通过统一管理和复用线程,提高了多线程环境下的效率和稳定性。在文件上传场景中,线程池能有效利用系统资源,加速大文件的上传速度,同时通过合理的任务调度和等待机制,确保上传过程的可靠性和一致...

    多线程控制,线程池模式,HTTP线程

    总的来说,多线程控制和线程池模式是优化程序性能和资源利用率的重要手段,而HTTP线程则是网络服务中不可或缺的部分。理解并熟练掌握这些技术,对于开发高效、稳定的系统至关重要。在实际项目中,我们需要根据具体...

    在spring boot中使用java线程池ExecutorService的讲解

    3. keepAliveTime:闲置线程存活时间,表示线程池中闲置线程可以存活多长时间。 4. unit:时间单位,表示 keepAliveTime 的时间单位,可以是秒、毫秒、微秒等。 使用线程池在 Spring Boot 中 在 Spring Boot 中...

    Java多线程-Socket编程

    在多线程-Socket 编程中,使用 ExecutorService 来实现线程池可以提高服务器端的性能。ExecutorService 可以将任务提交给线程池,线程池中的线程将执行任务,从而提高服务器端的并发处理能力。 在示例代码中,使用...

    多线程控制、线程池模型、HTTP线程.rar

    `99koo_ThreadPro.gif`可能是一个关于线程控制的图形化示例,`2ccc.com.nfo`可能包含更详细的介绍或者相关教程链接,而`ThreadPro`可能是源代码或文档,用于展示如何在具体项目中实现多线程控制和线程池模型。...

    常用多线程模板与鱼刺类多线程线程池应用小例子

    本篇文章将详细探讨“常用多线程模板”以及“鱼刺类(Fork/Join框架)多线程线程池”的应用,结合具体的代码实例来帮助理解这些概念。 首先,多线程是指在一个程序中同时执行多个不同的线程,以实现并行处理。在...

    多线程换IP源码(调用鱼刺线程池)

    这里提到的“多线程换IP源码(调用鱼刺线程池)”是一个程序,它利用多线程技术来实现IP地址的快速切换,并且这个过程调用了名为“鱼刺线程池”的组件。下面将详细解释这两个主要知识点。 **多线程** 多线程是一种...

    Java 线程池的原理与实现

    Java线程池是一种高级的多线程处理框架,它是Java并发编程中非常重要的一个组件。线程池的原理和实现涉及到操作系统调度、内存管理和并发控制等多个方面。理解线程池的工作原理有助于优化程序性能,避免过度创建和...

    java实现多线程文件传输

    在Java编程语言中,实现多线程文件传输是一种优化程序性能、提高系统资源利用率的有效方法。多线程允许我们同时处理多个任务,这对于大文件传输或需要并行处理的场景尤其有用。本篇文章将深入探讨如何使用Java实现多...

    java多线程、并发及线程池介绍收藏的几篇文档

    Java多线程、并发以及线程池是Java编程中至关重要的概念,特别是在处理高并发、高性能的系统设计时。以下是对这些主题的详细说明: 1. **Java 程序中的多线程** - 多线程允许一个程序同时执行多个任务,提高程序...

    Java ExecutorService四种线程池使用详解

    在Java多线程编程中,`ExecutorService` 是线程池的核心接口,它提供了一种管理线程的方式,包括创建、调度和终止线程。Java的`java.util.concurrent`包中提供了`ExecutorService`的实现类,特别是通过`Executors`...

    线程池简单实现chenjiegui

    在Java中,线程池是通过`java.util.concurrent`包中的`ExecutorService`接口及其实现类来实现的,如`ThreadPoolExecutor`。下面我们将深入探讨线程池的工作原理、核心参数以及如何在实际开发中使用线程池。 线程池...

    详解Java利用ExecutorService实现同步执行大量线程

    Java中的ExecutorService是Java并发编程的重要组成部分,它提供了一种高效、灵活的方式来管理和控制线程的执行。在处理大量线程或并发操作时,ExecutorService能够确保系统的稳定性和资源的有效利用,避免线程间的不...

    运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接.doc

    在处理Socket连接时,尤其是TCP和UDP通信,`ExecutorService`可以帮助我们有效地利用系统资源,通过创建线程池来处理多个客户端连接,避免频繁地创建和销毁线程带来的开销。 在TCP连接中,`ServerSocket`是Java网络...

    java多线程,对多线程,线程池进行封装,方便使用

    线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。使用线程池可以有效地控制运行的线程数量,避免过多线程导致系统资源过度消耗,同时也能简化线程的管理和回收。Java的...

    线程池的简单实现

    总结来说,线程池是一种优化多线程处理的方式,通过复用线程和控制并发量,提高了系统的效率和稳定性。在Java中,我们可以使用`ThreadPoolExecutor`来创建线程池,并通过`ExecutorService`接口进行管理和操作。通过...

    java多线程实现大批量数据导入源码

    本项目以"java多线程实现大批量数据导入源码"为题,旨在通过多线程策略将大量数据切分,并进行并行处理,以提高数据处理速度。 首先,我们需要理解Java中的线程机制。Java通过`Thread`类来创建和管理线程。每个线程...

    线程池的实现(JAVA)

    线程池是Java多线程编程中的一个重要概念,它是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池可以有效地控制运行的线程数量,当线程空闲时,会进行回收,这样可以减少...

    多线程(线程池)的相关研究资料

    在计算机科学领域,多线程和线程池是并发编程中的关键概念,它们极大地提高了程序的执行效率和系统资源的利用率。线程是操作系统分配CPU时间的基本单位,而线程池则是管理和调度线程的一种机制。 多线程是指在一个...

    Java中多线程的使用线程池.docx

    Java中的线程池是多线程编程中一种高效、可管理的执行机制。它通过预先创建并维护一组线程,避免了频繁地创建和销毁线程带来的开销,从而提高了程序的性能和响应速度。线程池的核心概念包括以下几个方面: 1. **...

Global site tag (gtag.js) - Google Analytics