У меня есть сервер на 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;
}
}
}
Здесь у меня та же проблема. Как правильно чистить и закрывать розетки?