采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求。
1.服务端
# 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.客户端
1. package sterning;
2.
3. import java.io.BufferedReader;
4. import java.io.IOException;
5. import java.io.InputStreamReader;
6. import java.io.OutputStream;
7. import java.net.Socket;
8. import java.util.concurrent.ExecutorService;
9. import java.util.concurrent.Executors;
10.
11. public class MultiThreadClient {
12.
13. public static void main(String[] args) {
14. int numTasks = 10;
15.
16. ExecutorService exec = Executors.newCachedThreadPool();
17.
18. for (int i = 0; i < numTasks; i++) {
19. exec.execute(createTask(i));
20. }
21.
22. }
23.
24. // 定义一个简单的任务
25. private static Runnable createTask(final int taskID) {
26. return new Runnable() {
27. private Socket socket = null;
28. private int port=8821;
29.
30. public void run() {
31. System.out.println("Task " + taskID + ":start");
32. try {
33. socket = new Socket("localhost", port);
34. // 发送关闭命令
35. OutputStream socketOut = socket.getOutputStream();
36. socketOut.write("shutdown\r\n".getBytes());
37.
38. // 接收服务器的反馈
39. BufferedReader br = new BufferedReader(
40. new InputStreamReader(socket.getInputStream()));
41. String msg = null;
42. while ((msg = br.readLine()) != null)
43. System.out.println(msg);
44. } catch (IOException e) {
45. e.printStackTrace();
46. }
47. }
48.
49. };
50. }
51. }
从而实现了多个客户端向服务器端发送请求,服务器端采用多线程的方式来处理的情况。
原文摘自:http://blog.csdn.net/flowerknight/archive/2009/06/14/4269052.aspx
分享到:
相关推荐
在 Spring Boot 中使用 Java 线程池 ExecutorService 的讲解 Spring Boot 作为一个流行的 Java 框架,提供了许多便捷的功能来帮助开发者快速构建应用程序。其中之一就是使用 Java 线程池 ExecutorService 来管理...
运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接
总结来说,这个文档描述了如何使用Java的`ExecutorService`线程池来处理TCP服务器的客户端连接。通过创建一个固定的线程池,服务器能够有效地并发处理多个客户端请求,同时避免了线程创建和销毁的开销。对于UDP通信...
在Java中,`java.util.concurrent`包下的`ExecutorService`、`ThreadPoolExecutor`和`Executors`类是实现线程池的关键。线程池通常包含核心线程数、最大线程数、工作队列、超时策略等参数,开发者可以根据实际需求...
ExecutorService是Java中实现线程池功能的接口,它扩展了Executor接口。Executor接口只有一个execute()方法,用于执行Runnable任务。ExecutorService则提供了更丰富的操作,如shutdown()用于停止接收新任务并等待已...
Java中的`java.util.concurrent`包提供了ExecutorService接口和ThreadPoolExecutor类,用于实现线程池服务。 在"JAVA 写的SOCKET线程池"项目中,`proxyserver`可能是一个示例程序,它展示了如何创建一个Socket...
线程池是Java并发处理的重要工具,它主要由`java.util.concurrent`包中的`ExecutorService`接口和相关的类实现。线程池可以有效地管理多个并发任务,避免频繁地创建和销毁线程带来的开销。在聊天室中,线程池可以...
Java的`java.util.concurrent`包中提供了`ExecutorService`的实现类,特别是通过`Executors`工厂类可以方便地创建四种类型的线程池,分别是`newCachedThreadPool`、`newFixedThreadPool`、`newScheduledThreadPool` ...
在Java中,线程池的实现主要依赖于`java.util.concurrent`包中的`ExecutorService`接口以及它的实现类,如`ThreadPoolExecutor`。不过,上述代码展示的是一个自定义的线程池实现,它可能没有使用Java标准库中的`...
ExecutorService线程池是Java并发编程中的核心组件,它位于`java.util.concurrent`包下,是`java.util.concurrent.Executor`接口的一个实现。ExecutorService提供了一种管理线程的方式,允许我们创建、管理和控制...
在Java中,线程池的实现主要依赖于`java.util.concurrent`包中的`ExecutorService`接口和其相关的类,如`ThreadPoolExecutor`。 线程池的工作原理是:当一个任务提交到线程池时,如果池中有空闲线程,那么这个任务...
Java线程池由`java.util.concurrent`包中的`ExecutorService`接口和其子类实现。其中,最常用的是`ThreadPoolExecutor`类,它提供了丰富的参数用于定制线程池的行为。线程池的核心组件包括: - **核心线程数...
- **线程池创建**:Java中的`ExecutorService`接口是线程池的核心,可以通过`Executors`类提供的静态工厂方法来创建线程池,如`newFixedThreadPool`、`newCachedThreadPool`等。 - **任务提交**:程序员通过`...
Java的`java.util.concurrent`包提供了`ExecutorService`接口,它是线程池的主要入口。通过实现这个接口,我们可以控制线程的执行方式,如设置最大线程数、处理任务队列等。`ExecutorService`通常与`...
在Java中,`java.util.concurrent.ExecutorService` 接口代表了一个线程池服务,而`ThreadPoolExecutor` 是它的具体实现,我们可以自定义线程池的核心参数,如核心线程数、最大线程数、线程存活时间、线程队列等。...
- **ThreadPoolExecutor类**:实现了ExecutorService接口,提供了更多自定义线程池的参数,如核心线程数、最大线程数、线程存活时间等。 - **Executors类**:提供了一些静态工厂方法,用于快速创建不同类型的...
Java并发库提供了`ExecutorService`接口和`ThreadPoolExecutor`类,它们提供了更为强大和灵活的线程池功能,如定时任务、拒绝策略等。 在设计和使用Socket线程池时,需要注意以下几点: - **线程池大小的设定**:...