Dzień dobry, robię właśnie program mający symulować przy użyciu socketów problem producenta-konsumenta. Mamy wielu producentów, każdy z nich podaje z jaką częstotliwością jest w stanie produkować towar, mamy wielu konsumentów, każdy z nich podaje z jaką częstotliwością jest w stanie produkt konsumować. Wyprodukowane przez producenta towary idą do magazynu (bufora) skąd pobierają je klienci. Pojemność bufora jest wprowadzana ze strony serwera. Gdy bufor jest wypełniony producenci kończą produkcję, gdy bufor się opróżnia, konsumenci przestają konsumować (cpt obvious).

Mam z całością dwa problemy:
1). Jak przenieść wstukaną w klasie server wielkość bufora do klasy ServerCommunicationThread gdzie będzie dalej używana? Kiedy przenosiłem odpowiedzialny za to kod do metody ServerCommunicationThread (czy to chamsko w metodę Run czy to w jakąś nową metodę w Run wywoływaną) komunikat żeby podać wielkość bufora pojawiał się na nowo przy każdym podłączeniu się nowego klienta.
2). Jak uzyskać to żeby licznik w ServerCommunicationThread był współdzielony dla wszystkich klientów? Bo przy tym co mam całość działa tak jakby każdy klient miał swój jeden bufor i dostaję coś takiego:

Dołączył nowy producent yyy. Jego częstotliwość produkcji/konsumpcji to 5
producent yyy wyprodukował przedmiot
Zawartość bufora = 1
Dołączył nowy producent aaa. Jego częstotliwość produkcji/konsumpcji to 3
producent aaa wyprodukował przedmiot
Zawartość bufora = 1
producent aaa wyprodukował przedmiot
Zawartość bufora = 2
producent yyy wyprodukował przedmiot
Zawartość bufora = 2

Kod wygląda tak:

 
public class Server {

    public static void main(String[] args) {
        int bufor;
        int i=0;
    

        ArrayList <ServerCommunicationThread> arrayOfThreads = new ArrayList <ServerCommunicationThread>();
        while (true)
        {    System.out.println("SERVER: Accepted client connecion on port 4444.");
        
            ServerSocket serverSocket = null;
            try {
                serverSocket = new ServerSocket(4444);
            } catch (IOException e) {
                System.err.println("SERVER: Could not listen on port: 4444, " + e);
                System.exit(1);
            }
            
            System.out.println("SERVER: Server connection opened on port 4444.");
            while(i<1){
                Scanner skaner = new Scanner(System.in);
                System.out.println("Wprowadź rozmiar bufora");    
                bufor = skaner.nextInt();
                    System.out.println("Rozmiar bufora to " + bufor);
                    i++;
            }
            
            Socket clientSocket = null;
            try {
                // after this method server stops and waits for new client connection
                clientSocket = serverSocket.accept();
                serverSocket.close();
            } catch (IOException e) {
                System.err.println("SERVER: Accept failed: 4444, " + e);
                System.exit(1);
            }
        
            ServerCommunicationThread thread = new ServerCommunicationThread(clientSocket, arrayOfThreads);
            arrayOfThreads.add(thread);
            thread.start();
        }
    }

}
//---------------------------------------------------------------------------------------------------------------

public class Client {

    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 4444);
            System.out.println("CLIENT: Server connected on port 4444");
            
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println("CLIENT: IN and OUT streams opened. Starting sending data...");
            
            ClientInputThread thread = new ClientInputThread(socket);
            thread.start();
            
            String serverResponse;
            
            while ((serverResponse = in.readLine()) != null) {
                System.out.println("Server: " + serverResponse);
                
                if (serverResponse.equals("koniec")) {
                    break;
                }
            } 

            System.out.println("CLIENT: Ending server connection. Closing client streams and socket.");
            out.close();
            in.close();
            socket.close();
            System.exit(0);
        } catch (UnknownHostException e) {
            System.err.println("CLIENT: Trying to connect to unknown host: " + e);
            System.exit(1);
        } catch (Exception e) {
            System.err.println("CLIENT: Exception:  " + e);
            System.exit(1);
        }

    }

}

//---------------------------------------------------------------------------------------------------------------------
public class ClientInputThread extends Thread {
    public String klasa;
    public String nazwa;
    public int freq;
    public String wczytane;
    private PrintWriter out;
    BufferedReader in;

    
    public ClientInputThread(Socket clientSocket)
    {
        try {
            out = new PrintWriter(clientSocket.getOutputStream(), true);

        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }
    
    
    public void ustalKlaseKlienta() {
        Scanner klasowczytywacz = new Scanner(System.in);
        System.out
                .println("Jeżeli jesteś producentem, wpisz A. Jeżeli jesteś konsumentem, wpisz B");
        String klasawczytana = klasowczytywacz.nextLine();
        if (klasawczytana.equals("A")) {
            klasa = "producent";
            System.out.println("Zostałeś przypisany do roli: " + klasa);
        }
        if (klasawczytana.equals("B")) {
            klasa = "konsument";
            System.out.println("Zostałeś przypisany do roli: " + klasa);
        }
    }

    public void ustalNazweKlienta() {
        Scanner nazwowczytywacz = new Scanner(System.in);
        System.out.println("Podaj swoją nazwę i wciśnij enter");
        nazwa = nazwowczytywacz.nextLine();
        System.out.println("Nazywasz się " + nazwa);
    }

    public void frequency() {
        Scanner czestotliwosc = new Scanner(System.in);
        if (klasa.equals("producent")) {
            System.out.println("Podaj swoją częstotliwość produkcji");
        }
        if (klasa.equals("konsument")) {
            System.out.println("Podaj swoją częstotliwość konsumpcji");
        }
        freq = czestotliwosc.nextInt();
        System.out.println("Częstotliwość = " + freq);
    }
    
    public void run() {
        try{    
            ustalKlaseKlienta();
            ustalNazweKlienta();
            frequency();

            out.println(freq);
            out.println(nazwa);
            out.println(klasa);
             System.out.println("Dziękujemy za podanie danych.");
            wczytane = in.readLine();
             System.out.println(wczytane);
             out.flush();
    System.exit(0);
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
    }
}
//--------------------------------------------------------------
public class ServerCommunicationThread extends Thread implements Runnable{
    Socket clientSocket;
    BufferedReader in;
    int opcjaklasy;
    PrintWriter out;
    int freq;
    String nazwa;
    String klasa;
    ArrayList<ServerCommunicationThread> arrayOfThreads;

    
    public ServerCommunicationThread(Socket clientSocket, ArrayList<ServerCommunicationThread> arrayOfThreads2) {
        this.clientSocket = clientSocket;
        this.arrayOfThreads = arrayOfThreads;
        try {
            in = new BufferedReader(new InputStreamReader(
                    clientSocket.getInputStream()));
            out = new PrintWriter(clientSocket.getOutputStream(), true);

        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }

    }

    public void sendMessage(String message) {
        out.println(message);
        out.flush();
    }
@Override
    public void run() {
        try {

            int freq = Integer.parseInt(in.readLine());
            String nazwa = in.readLine();
            String klasa = in.readLine();
            System.out.println("Dołączył nowy " + klasa + " " + nazwa
                    + ". Jego częstotliwość produkcji/konsumpcji to " + freq);
            int licznik = 0;
        
            
            
            
            if (klasa.equals("konsument")) {
                while (licznik >= 0) {
                    licznik--;
                    System.out.println(klasa + " " + nazwa
                            + " skonsumował przedmiot");
                    System.out.println("Zawartość bufora = " + licznik);
                    TimeUnit.SECONDS.sleep(freq);

                }
            }
            if (klasa.equals("producent")) {
                while (bufor >= licznik) {
                    licznik++;                
                    System.out.println("");
                    System.out.println(klasa + " " + nazwa
                            + " wyprodukował przedmiot");
                    
                    System.out.println("Zawartość bufora = " + licznik);
                    TimeUnit.SECONDS.sleep(freq);
                }
            }
System.out
                    .println("SERVER: Ending sequence received. Closing streams and sockets.");
            out.close();
            in.close();
            clientSocket.close();
            System.exit(0);
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Z góry dziękuję za waszą pomoc.