Невозможно читать и писать на терминале одновременно - PullRequest
0 голосов
/ 13 апреля 2019

Я пытался создать небольшую программу, которая имитирует движение ящика. Когда пользователь нажимает a, поле перемещается влево, а когда он нажимает s, оно перемещается вправо.

Визуально поле и его пространство выполняются строкой с именем mystring, которая определяется как

static String mystring = new String(":------<><>------:");

в основном классе, где : - стены, а <><> - поле.

Для этого я создал два потока: один читает, а другой должен писать. Оба должны работать параллельно.

Перед публикацией кода я опишу текущую проблему и причину, по которой я написал этот вопрос:

Я бы хотел, чтобы вы помогли мне, поскольку моя логика неверна. По какой-то причине метод write никогда не вызывается. Что я должен изменить, чтобы достичь своей цели?

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


Код:

import java.io.IOException;

public class Main {

    static String mystring = new String(":------<><>------:");
    static synchronized String getMyS(){return mystring;}
    static synchronized void setMyS(String ss){mystring = ss;}

    static synchronized void read(){
        try {
            char c;
            c = (char) System.in.read();
            System.in.read();
            if (c == 'a' & getMyS().substring(1, 2).equals("-")) {
                setMyS(":" + getMyS().substring(2, 17) + "-:");
            } else if (c == 's' & getMyS().substring(16, 17).equals("-")) {
                setMyS(":-" + getMyS().substring(1, 16) + ":");
            }
        } catch (IOException x) {

        }
    }

    static synchronized void write(){

        try
        {
            System.out.println(getMyS());
                Thread.sleep(400);
        }
        catch(Exception a)
        {

        }
    }

    public static void main(String[] args)
    {
        Thread t1 = new Thread(
                () ->
                {
                    while (true) {
                        read();
                    }
                }
        );

        Thread t2 = new Thread(
        () ->
            {
                while(true){
                    try
                    {
                        write();
                        Thread.sleep(400);
                    }
                    catch(Exception a)
                    {}
                }

            }
        );

        t1.start();
        t2.start();

        try
        {

            Thread.sleep(10000);
            System.out.println("TEEEEEEEEEEa" +
                    "");
            t1.interrupt();
            t2.interrupt();
        }
        catch(InterruptedException e)
        {

        }

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