无法在终端上同时读写

时间:2019-04-13 00:38:32

标签: java multithreading io

我一直在尝试制作一个模拟盒子运动的小程序。当用户按下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)
        {

        }

    }
}

0 个答案:

没有答案