Я пытался создать небольшую программу, которая имитирует движение ящика. Когда пользователь нажимает 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)
{
}
}
}