线程管理
- 线程池:使用
ThreadPoolExecutor
创建线程池来处理客户端连接,避免为每个连接创建新线程带来的开销。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Server {
private static final int CORE_POOL_SIZE = 10;
private static final int MAX_POOL_SIZE = 100;
private static final int KEEP_ALIVE_TIME = 10;
private static ExecutorService executorService = Executors.newFixedThreadPool(CORE_POOL_SIZE);
public static void main(String[] args) {
// 初始化服务器相关操作
// 假设ServerSocket已创建为serverSocket
while (true) {
try {
Socket clientSocket = serverSocket.accept();
executorService.submit(new ClientHandler(clientSocket));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 线程数量优化:根据服务器硬件资源,合理设置线程池的核心线程数和最大线程数。如上面代码中,
CORE_POOL_SIZE
设为10,MAX_POOL_SIZE
设为100 ,可根据实际情况调整。
缓冲区设置
- 字节缓冲区:使用
BufferedInputStream
和BufferedOutputStream
对输入输出流进行缓冲,提高数据读写效率。
public class ClientHandler implements Runnable {
private Socket clientSocket;
public ClientHandler(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
try (BufferedInputStream bis = new BufferedInputStream(clientSocket.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(clientSocket.getOutputStream())) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = bis.read(buffer)) != -1) {
bos.write(buffer, 0, bytesRead);
bos.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 缓冲区大小:合理设置缓冲区大小,如上面代码中,
byte[] buffer = new byte[1024]
,1024字节是一个常用的缓冲区大小,也可根据实际数据量和网络情况调整。
其他优化
- NIO结合:虽然是BIO场景,但可以部分结合NIO的
ByteBuffer
等机制,进一步优化缓冲区操作。
- 减少阻塞:在处理业务逻辑时,尽量减少线程的阻塞时间,例如将耗时操作放入异步任务执行。