执行器接口在 java 中如何工作?
how the executor interface works in java?
我正在研究一本关于java套接字的书,刚看的那一章讲的是多连接,即一个服务器通过线程同时连接多个客户端。解释创建这些连接的两种方法,1) 为每个客户端创建一个新线程。 2)使用有限数量的N个线程同时处理N个客户端的请求,其他的排队。然后他介绍了 Executor 接口,据我所知,这是最好的方法,因为它重用了我们已经使用但不再使用的线程(我可能误解了,因为我是用英文阅读的,我不明白好吧 )。所以我在java中做了一个例子:
public class Server{
public static void main(String[] args){
ServerSocket ServSock=new ServerSocket(6666);
Executor service=Executors.newCachedThreadPool();
while(true){
Socket ClntSock=ServSock.accept();
service.execute(new EchoProtocol(ClntSock));
}
}
}
EchoProtocol.java是一个扩展Thread的class,客户端向服务器发送一个字符串,服务器发送和客户端一样。为了测试它是否重用了线程,我将它放在构造函数中:
System.out.println(getName());
但是每次我 运行 一个新客户时,即使我已经完成了一些客户,也会打印出 Thread-0 Thread-1 Thread-2... 不断增加的索引。所以不要重用线程?我有什么不明白的?
我决定使用 ExecutorService class
我正在研究一本关于java套接字的书,刚看的那一章讲的是多连接,即一个服务器通过线程同时连接多个客户端。解释创建这些连接的两种方法,1) 为每个客户端创建一个新线程。 2)使用有限数量的N个线程同时处理N个客户端的请求,其他的排队。然后他介绍了 Executor 接口,据我所知,这是最好的方法,因为它重用了我们已经使用但不再使用的线程(我可能误解了,因为我是用英文阅读的,我不明白好吧 )。所以我在java中做了一个例子:
public class Server{
public static void main(String[] args){
ServerSocket ServSock=new ServerSocket(6666);
Executor service=Executors.newCachedThreadPool();
while(true){
Socket ClntSock=ServSock.accept();
service.execute(new EchoProtocol(ClntSock));
}
}
}
EchoProtocol.java是一个扩展Thread的class,客户端向服务器发送一个字符串,服务器发送和客户端一样。为了测试它是否重用了线程,我将它放在构造函数中:
System.out.println(getName());
但是每次我 运行 一个新客户时,即使我已经完成了一些客户,也会打印出 Thread-0 Thread-1 Thread-2... 不断增加的索引。所以不要重用线程?我有什么不明白的?
我决定使用 ExecutorService class