服務端線程池處理客戶端請求,拒絕策略ThreadPoolExecutor.AbortPolicy(),客戶端請求過大時Main線程拋異常:java.util.concurrent.RejectedExecutionException。實際業務可以切換其它拒絕策略。
package com.me.serverSocketDemo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ServerListener {
private static final int port = 8888;
ThreadPoolExecutor threadPoolExecutor =
new ThreadPoolExecutor(2,5,5, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(10), Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
public static void main(String[] args) {
ServerListener serverListener = new ServerListener();
serverListener.start();
}
public void start() {
try {
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("開啓監聽:");
while (true) {
Socket socket = serverSocket.accept();
threadPoolExecutor.execute(new HandlerThread(socket));
}
} catch (IOException e) {
System.out.println("服務端異常!");
e.printStackTrace();
}
}
}
class HandlerThread implements Runnable {
private Socket socket ;
public HandlerThread(Socket s) {
socket = s;
try {
socket.setSoTimeout(10000);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
//讀取客戶端數據
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String s = input.readLine();
System.out.println("服務端收到客戶端發來的數據:" + s+ " 處理線程:" + Thread.currentThread().getName());
Thread.sleep(200);
input.close();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
socket = null;
System.out.println("服務端 finally 異常:" + e.getMessage());
}
}
}
}
}
client端代碼:
package com.me.serverSocketDemo;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.UUID;
public class Client {
public static final int port = 8888;
public static final String host = "localhost";
public static void main(String[] args) {
System.out.println("Client run...");
while (true) {
Socket socket = null;
try {
//創建一個流套接字並將其連接到指定主機上的指定端口號
socket = new Socket(host,port);
//向服務器端發送數據
PrintStream out = new PrintStream(socket.getOutputStream());
String str ;
for (int i = 0;i < 30; i++) { //建立一次連接發三十個消息到服務端
str = Thread.currentThread().getName() + ":" + UUID.randomUUID() + ":" + System.currentTimeMillis();
System.out.println("client send :" + str);
out.println(str);
}
out.close();
} catch (Exception e) {
System.out.println("客戶端異常:" + e.getMessage());
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
socket = null;
System.out.println("客戶端 finally 異常:" + e.getMessage());
}
}
}
}
}
}