java - ExecutorService 是否消耗线程容量
问题描述
我正在尝试创建一个消息传递应用程序。我有一个班级MessageServer
,我打算将客户连接到这个班级。每个Client
类都实现Runnable
. ExecutorService
我的方法是在类内部创建一个MessageServer
,并从这里执行每个客户端。
我的问题是,我可以Runnable
根据它们执行无限数量的Executors.newFixedThreadPool(x)
线程还是它们算作单个线程?
如果可能的话,我对新方法持开放态度。我还从 main 方法启动 MessageServer 线程。
消息服务器
public class MessageServer extends Server implements Runnable{
static LinkedList<Message> messages = new LinkedList<>();
LinkedList<Client> clients = new LinkedList<>();
ExecutorService clientPool = Executors.newFixedThreadPool(3);
public MessageServer() throws IOException {
super(Vars.MESSAGE_PORT);
}
public void addToMessages(Message message) {
if (!messages.contains(message)) {
messages.add(message);
}
}
@Override
public void run() {
while(true){
try {
Socket client = serverSocket.accept();
//Read Client data then add to the list
ObjectOutputStream out = new ObjectOutputStream(client.getOutputStream());
ObjectInputStream in = new ObjectInputStream(client.getInputStream());
Client current = (Client)in.readObject();
clients.add(current);
} catch (Exception ex) {
Logger.getLogger(MessageServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
超一流的 服务器
public class Server{
InetAddress address;
LinkedList<Client> clients = new LinkedList<>();
protected ServerSocket serverSocket;
public Server(int port) throws IOException {
serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(Vars.SERVER_TIMEOUT_MS);
//ip = Utilities.getIp();
address = serverSocket.getInetAddress();
}
}
客户
public class Client implements Serializable {
protected String nickname;
protected long id;
protected int key;
// MessageServer
protected transient ObjectOutputStream msgOut;
protected transient ObjectInputStream msgIn;
protected transient Socket messageSocket;
protected transient Socket videoSocket;
public Client(String nickname){
this.nickname = nickname;
createid();
makeConnection();
key = (int) (Math.random() * 8999) + 1000;
}
void makeConnection(){
try {
messageSocket = new Socket(Vars.IP, Vars.MESSAGE_PORT);
//TODO make connection with videoServer
msgOut = new ObjectOutputStream(messageSocket.getOutputStream());
msgIn = new ObjectInputStream(messageSocket.getInputStream());
msgOut.writeObject(this);
} catch (IOException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
}
final void createid(){
id = 3;
id = 13 * id + Objects.hashCode(this.nickname);
}
// Getters-setters-hashcode-equals
解决方案
我的问题是,我可以根据 Executors.newFixedThreadPool(x) 执行无限量的 Runnable,还是它们算作单个线程?
您可以添加比线程更多的可运行文件。它们存储在队列中,并在线程可用时执行。
在Executors.newFixedThreadPool
方法的 Javadoc 中:
创建一个线程池,该线程池重用在共享无界队列上运行的固定数量的线程。
所以,是的,它是“无限的”。