Проблемы с пониманием потоков и сменой переменных в нескольких потоках - PullRequest
0 голосов
/ 27 мая 2019

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

Пробовал AtomicBoolean, но я не работал

public class Client {

    private static final Logger LOGGER = LogManager.getLogger();
    private BufferedReader consoleReader;
    private String name;
    private String address;
    private int port;
    private Thread writeMessage, readMessage;
    private ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("UTC"));
    private LocalTime dTime = zonedDateTime.toLocalTime();
    private Net net;
    private AtomicBoolean running = new AtomicBoolean(true);

    public Client(String address, int port) {
        this.address = address;
        this.port = port;
        net = new Net(address, port);
        consoleReader = new BufferedReader(new InputStreamReader(System.in));
        printName();
        readMessage();
        writeMessage();
    }

    private void printName() {
        System.out.println("Print your name:");
        try {
            name = consoleReader.readLine();
            while (NameValidator.nameIsValid(name)) {
                System.out.println("Name should contain more than 1 letter");
                name = consoleReader.readLine();
            }
            net.send(name + "\n");
        } catch (IOException e) {
            LOGGER.error(e);
        }
    }

    private void readMessage() {
        readMessage = new Thread(() -> {
            String str = net.receive();
            while (net.isConnected()) {
                if ("full".equals(str)) {
                    System.out.println("server is full");
                    running.set(false);
                    break;
                } else {
                    System.out.println(str);
                    str = net.receive();
                }
            }
            net.offService();
        }, "readMessage");
        readMessage.start();
    }

    private void writeMessage() {
        writeMessage = new Thread(() -> {
            while (running.get()) {
                String userWord;
                try {
                    String time = dTime.getHour() + ":" + dTime.getMinute() + ":" + dTime.getSecond();
                    userWord = consoleReader.readLine();
                    if (userWord.equals("quit")) {
                        net.send(userWord + "\n");
                        ClientAmountGenerator.decrement();
                        running.set(false);
                    } else {
                        net.send("(" + time + ") " + name + " says : " + userWord + "\n");
                    }
                } catch (IOException e) {
                    LOGGER.error(e);
                }
            }
            net.offService();
        }, "writeMessage");
        writeMessage.start();
    }
}

Я хочу изменить запуск на "false", поэтому поток writeMessage не будет работать, если он получит сообщение "full" с сервера

...