`
abc20899
  • 浏览: 937557 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

        };
    }
}


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

相关推荐

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

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

    线程池管理多线程上传

    线程池管理和多线程上传是并发编程中的一个重要实践,特别是在大数据传输和网络服务中。在Java等编程语言中,线程池通过有效地管理和复用线程资源,避免了频繁创建和销毁线程带来的开销,提升了系统性能。下面将详细...

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

    然而,多线程也带来了同步问题,如数据竞争和死锁,因此需要通过锁机制(如互斥量、信号量)和条件变量等工具进行有效控制,确保线程安全。 线程池模式是一种管理线程的技术,它预先创建了一组线程,当有新的任务...

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

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

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

    在IT行业中,多线程和线程池是提高程序并发性能和资源管理的关键技术。尤其在Java编程领域,它们在大型系统和并发密集型应用中扮演着重要角色。本篇文章将详细探讨“常用多线程模板”以及“鱼刺类(Fork/Join框架)...

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

    根据提供的文档标题、描述以及部分内容,我们可以总结出以下关于如何运用Java中的`concurrent.ExecutorService`线程池实现socket的TCP和UDP连接的关键知识点: ### 1. 理解Java中的`concurrent.ExecutorService` `...

    Java 线程池的原理与实现

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

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

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

    java多线程加队列上传文件_后台处理

    1. **多线程设计**:在Java中,多线程是通过`Thread`类或实现`Runnable`接口来实现的。本案例采用实现`Runnable`接口的方式定义了`UploadThread`类,该类用于处理客户端上传文件的具体逻辑。 2. **文件读写操作**:...

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

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

    java实现多线程文件传输

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

    线程池简单实现chenjiegui

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

    Android实现多线程下载

    本教程将深入讲解如何在Android环境中实现多线程下载功能,以及涉及的相关知识点。 首先,我们需要理解Android的线程模型。Android系统的主要UI线程(也称为主线程)负责处理用户交互和界面更新。为了不影响用户...

    Java多线程-Socket编程

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

    线程池的实现(JAVA)

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

    3.1.8.线程池的实现原理分析1

    线程池是Java中一种高效的线程管理机制,它的出现是为了优化线程的创建和销毁过程,以提高系统的响应速度并合理利用系统资源。...理解线程池的实现原理和使用方式,对于开发高效、稳定的多线程应用至关重要。

    tcp_thread_java.zip_Java 线程池_java TCP线程

    在Java中,线程池的实现主要依赖于`java.util.concurrent`包中的`ExecutorService`接口及其相关的类,特别是`ThreadPoolExecutor`和`Executors`工厂类。`tcp_thread_java.zip`这个压缩包包含的示例代码展示了如何...

    多线程分别下载文件

    Thread类是最基础的线程实现方式,而ExecutorService则提供了更高级的线程池管理,可以更好地控制线程的并发数量,防止过度消耗系统资源。 为了分别跟踪每个文件的下载进度,我们可以使用Android的ProgressBar组件...

    Java线程池及观察者模式解决多线程意外死亡重启问题

    在Java中,`java.util.concurrent`包提供了`ExecutorService`接口及其实现,如`ThreadPoolExecutor`,来创建和管理线程池。 线程池的工作原理是通过维护一个工作线程集合,当提交任务时,线程池会从队列中选择一个...

Global site tag (gtag.js) - Google Analytics