首页 > 解决方案 > 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

标签: javamultithreadingsocketsoopexecutorservice

解决方案


我的问题是,我可以根据 Executors.newFixedThreadPool(x) 执行无限量的 Runnable,还是它们算作单个线程?

您可以添加比线程更多的可运行文件。它们存储在队列中,并在线程可用时执行。

Executors.newFixedThreadPool方法的 Javadoc 中:

创建一个线程池,该线程池重用在共享无界队列上运行的固定数量的线程。

所以,是的,它是“无限的”。


推荐阅读