Проблема с очисткой пула потоков - PullRequest
2 голосов
/ 10 июня 2011

У меня есть сервер на Java с многопоточностью, и я создал для него пул потоков. Теперь все идет хорошо, и мой сервер принимает и читает данные от клиентов, которые к нему подключаются, но я не знаю, как на самом деле чистить сокеты после закрытия соединений.

Так вот мой код:

public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub

    ThreadPooledServer server = new ThreadPooledServer(queue,7001);
    new Thread(server).start();
}

Класс ThreadPooledServer:

public class ThreadPooledServer implements Runnable {
    protected ExecutorService threadPool = Executors.newFixedThreadPool(5);

public ThreadPooledServer(BlockingQueue queue,int port) {
    this.serverPort = port;
    this.queue=queue;
}

    public void run() {
        openServerSocket();

        while (!isStopped()) {
            Socket clientSocket = null;
            try {
                clientSocket = serverSocket.accept();
                clientconnection++;
            } catch (IOException e) {
                if (isStopped()) {
                    System.out.println("Server Stopped.");
        return;
            }

            throw new RuntimeException("Error accepting client connection", e);
        }

        WorkerRunnable workerRunnable = new WorkerRunnable(queue,clientSocket);

        this.threadPool.execute(workerRunnable);

    }
    this.threadPool.shutdown();

    System.out.println("Server Stopped.");
}

private synchronized boolean isStopped() {
    return this.isStopped;
}

public synchronized void stop() {
    this.isStopped = true;

    try {
        this.serverSocket.close();
    }

    catch (IOException e) {
        throw new RuntimeException("Error closing server", e);
    }
}

Вот что я не понимаю: мой цикл while(), который принимает клиенты, работает так же долго, как isStopped - ложь.

Когда для isStopped установлено значение true, цикл завершается, а затем я закрываю пул потоков, что является правильным.

isStopped имеет значение true в onstop () {..............} ....

Куда мне звонить onstop () ...?

Потому что в данный момент я не использую этот метод, я не вызываю его, а это означает, что я неправильно очищаю свои потоки.

WorkerRunnable класс:

    public class WorkerRunnable implements Runnable {
        public WorkerRunnable(BlockingQueue queue2, Socket clientSocket2) {
        // TODO Auto-generated constructor stub

            this.clientSocket2 = clientSocket2;

            this.queue2 = queue2;
        }

        public void run() {
            try {
                is = new ObjectInputStream(this.clientSocket2.getInputStream());

                try {
                    while (!stop) {
                        System.out.println("Suntem in interiorul buclei while:!");

                        v = (Coordinate) is.readObject();

                        queue2.put(v);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    is.close();

                    clientSocket2.close();
                }

                is.close();
                clientSocket2.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void stop() {
            this.stop = true;
        }
    }
}

Здесь у меня та же проблема. Как правильно чистить и закрывать розетки?

1 Ответ

0 голосов
/ 10 июня 2011

Как только вы вызовете shutdown(), пул потоков закроет каждый поток после завершения всех задач.

Вы должны вызывать onstop() из любого кода, который знает, что пул должен быть отключен. Это зависит от того, что делает остальная часть вашего приложения, и почему вы остановите пул до его завершения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...