#java #многопоточность #инспекция_кода #observer
Мне необходимо создать приложение, которое будет получать данные по сети и передавать их другим классам для обработки. Я решила воспользоваться для этого шаблоном observer, но столкнулась с проблемой. Одновременно может поступить несколько соединений, поэтому для каждого я создаю новый экземпляр класса с принятием соединения и обработкой данных. Но как тогда правильно привязать наблюдателей к классу сервера. Чтобы использовать что-то в дополнительном потоке переменная должна быть статическая или финальная. Финальная не подходит, потому что на каждое соединение новый экземпляр сервера. А статическая меня смущает, я не совсем понимаю, как это работает. Внизу приведен код, подскажите, пожалуйста, как правильно это организовать, чтобы во время эксплуатации никакая фигня не вылезла. Это главный класс public class Main { static Server server = new Server(); public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { try { int i = 0; // счётчик подключений ServerSocket socket = new ServerSocket(3013); while(true)// слушаем порт { server = new Server(i, socket.accept()); i++; } } catch(Exception e){ System.out.println("init: " + e); } } }).start(); ConcreteObserver observer = new ConcreteObserver(server); } } Это класс сервера public class Server extends Thread implements Observable { Socket socket; int num; Liststring = null; private static List observers; public Server() { observers = new ArrayList (); } public Server(int num, Socket s) { this.num = num; this.socket = s; start(); } public void run() { // doing something notifyObservers(); } public void addObserver(Observer o) { if (o != null) { observers.add(o); } } public void deleteObserver(Observer o) { if (o != null) { observers.remove(o); } } public void notifyObservers() { for (Observer observer : observers) { observer.update(listMettUnits); } } } И класс наблюдателя public class ComputeAll implements Observer { private Server server = null; public ComputeAll(Server server) { this.server = server; server.addObserver(this); } public void update(List list) { // doing something } }
Ответы
Ответ 1
По данному коду у меня есть несколько замечаний. для observers не рекомендуется использовать LinkedList, лучше воспользоваться потокобезопасной реализацией, например java.util.concurrent.CopyOnWriteArrayList; регистрировать наблюдателей предпочтительнее до запуска сервера. Поля в классе Server и ComputeAll я бы сделал final Запуск потока в его конструкторе не очень хорошая идея, и вообще, явное создание потоков не есть хорошо, воспользуйтесь, как вариант, java.util.concurrent.ExecutorService И что касается не многопоточности, observers является статическим, что скорее всего не совсем верно.
Комментариев нет:
Отправить комментарий