JDK提供了线程池的类Executors,可以通过静态方法生成实例
1.常见的静态方法
newCachedThreadPool 有任务才会创建线程
newFixedThreadPool(int size) 创建固定数目的线程,通常使用此种方法
newSingleThreadExecutor 只有一个线程
newScheduledThreadPool(int size) 按预定的执行任务,设定最小数目
newSingleThreadScheduledExecutor 线程池只有一个线程,按时间计划执行
2.根据可用cup确定开启线程数
Runtime.getRuntime().avaliableProcessors();
3.创建线程池
Executors.newFixedThreadPool(3);
4.执行任务
while(true){
executor(Runnable(socket));
}
5.关闭线程池
shutdown()
6.摘取的源码
public MYServer() throws Exception{
server = new ServerSocket(port);
executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*poolSize);
System.out.println("服务器启动");
}
public void service(){
while(true){
Socket socket = null;
try {
socket = server.accept();
executorService.execute(new Handler(socket));
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception {
new MYServer().service();
}
class Handler implements Runnable{
private Socket socket;
public Handler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
System.out.println("new connection:"+socket.getInetAddress());
try {
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
String msg = null;
while((msg=br.readLine())!=null){
System.out.println(msg);
pw.println("received");
if(msg.equals("88")){
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally{
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}