`

采用Java 5的ExecutorService实现线程池

    博客分类:
  • Java
阅读更多

采用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 线程池 ExecutorService 的讲解 Spring Boot 作为一个流行的 Java 框架,提供了许多便捷的功能来帮助开发者快速构建应用程序。其中之一就是使用 Java 线程池 ExecutorService 来管理...

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

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

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

    总结来说,这个文档描述了如何使用Java的`ExecutorService`线程池来处理TCP服务器的客户端连接。通过创建一个固定的线程池,服务器能够有效地并发处理多个客户端请求,同时避免了线程创建和销毁的开销。对于UDP通信...

    Java实现的线程池、消息队列功能

    在Java中,`java.util.concurrent`包下的`ExecutorService`、`ThreadPoolExecutor`和`Executors`类是实现线程池的关键。线程池通常包含核心线程数、最大线程数、工作队列、超时策略等参数,开发者可以根据实际需求...

    Java 线程池ExecutorService详解及实例代码

    ExecutorService是Java中实现线程池功能的接口,它扩展了Executor接口。Executor接口只有一个execute()方法,用于执行Runnable任务。ExecutorService则提供了更丰富的操作,如shutdown()用于停止接收新任务并等待已...

    JAVA 写的SOCKET线程池

    Java中的`java.util.concurrent`包提供了ExecutorService接口和ThreadPoolExecutor类,用于实现线程池服务。 在"JAVA 写的SOCKET线程池"项目中,`proxyserver`可能是一个示例程序,它展示了如何创建一个Socket...

    java聊天室,利用线程池实现多用户聊天室

    线程池是Java并发处理的重要工具,它主要由`java.util.concurrent`包中的`ExecutorService`接口和相关的类实现。线程池可以有效地管理多个并发任务,避免频繁地创建和销毁线程带来的开销。在聊天室中,线程池可以...

    Java ExecutorService四种线程池使用详解

    Java的`java.util.concurrent`包中提供了`ExecutorService`的实现类,特别是通过`Executors`工厂类可以方便地创建四种类型的线程池,分别是`newCachedThreadPool`、`newFixedThreadPool`、`newScheduledThreadPool` ...

    Java版线程池实现

    在Java中,线程池的实现主要依赖于`java.util.concurrent`包中的`ExecutorService`接口以及它的实现类,如`ThreadPoolExecutor`。不过,上述代码展示的是一个自定义的线程池实现,它可能没有使用Java标准库中的`...

    ExecutorService线程池

    ExecutorService线程池是Java并发编程中的核心组件,它位于`java.util.concurrent`包下,是`java.util.concurrent.Executor`接口的一个实现。ExecutorService提供了一种管理线程的方式,允许我们创建、管理和控制...

    JAVA集中常用的线程池比较.pdf

    在Java中,线程池的实现主要依赖于`java.util.concurrent`包中的`ExecutorService`接口和其相关的类,如`ThreadPoolExecutor`。 线程池的工作原理是:当一个任务提交到线程池时,如果池中有空闲线程,那么这个任务...

    java线程池封装j

    Java线程池由`java.util.concurrent`包中的`ExecutorService`接口和其子类实现。其中,最常用的是`ThreadPoolExecutor`类,它提供了丰富的参数用于定制线程池的行为。线程池的核心组件包括: - **核心线程数...

    java 手术任务(线程池)

    - **线程池创建**:Java中的`ExecutorService`接口是线程池的核心,可以通过`Executors`类提供的静态工厂方法来创建线程池,如`newFixedThreadPool`、`newCachedThreadPool`等。 - **任务提交**:程序员通过`...

    Java/Android线程池演示Demo

    Java的`java.util.concurrent`包提供了`ExecutorService`接口,它是线程池的主要入口。通过实现这个接口,我们可以控制线程的执行方式,如设置最大线程数、处理任务队列等。`ExecutorService`通常与`...

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

    Java的ExecutorService和ThreadPoolExecutor是线程池的核心组件。 1. **线程创建和销毁成本** 创建和销毁线程是有一定开销的,包括虚拟内存分配、上下文切换等。线程池通过重用已存在的线程,避免了频繁创建和销毁...

    java.util.concurrent 实现线程池队列

    在Java中,`java.util.concurrent.ExecutorService` 接口代表了一个线程池服务,而`ThreadPoolExecutor` 是它的具体实现,我们可以自定义线程池的核心参数,如核心线程数、最大线程数、线程存活时间、线程队列等。...

    java多种类型的线程池操作

    - **ThreadPoolExecutor类**:实现了ExecutorService接口,提供了更多自定义线程池的参数,如核心线程数、最大线程数、线程存活时间等。 - **Executors类**:提供了一些静态工厂方法,用于快速创建不同类型的...

Global site tag (gtag.js) - Google Analytics