来自另一个线程的 Java 控制台输出被丢弃

标签 java multithreading console

我的其中一个线程的控制台输出被删除时出现问题(在 Java 中)。情况如下:我生成了一个线程来监听(使用阻塞方法)传入的消息。然后将这些消息异步写入控制台。同时,我通过 System.console().readLine() 在控制台上读取用户输入。

问题是文本根本不会写入控制台。我的意思是,由于 readLine() 方法是阻塞的,我希望控制台至少在主线程中输入内容后立即显示已写入控制台的输出。还是我错过了重点?

相关出处是

// ...

// handle receiving messages
(new Thread() {
    @Override
    public void run() {
        while (executing) received(new String(subSocket.recv(0)));
    }
}).start();

// ...

String input;
try {
    while ((input = System.console().readLine()) != null && !input.equals(".")) {
        pubSocket.send(input.getBytes(), 0);
        Thread.yield();
    }
} 
catch (Exception ex) { }
finally {executing = false;}

接收到的方法是

public void received(String s) {
    System.console().format("(%s)", s);
    System.console().flush();
}

我做错了什么?或者有更好的方法吗?我的意思是,我尝试使用 BufferedReader 封装输入流以便按行读取它并使用 System.out.format() ..相同效果 - 没有 :(。

干杯, 效果

最佳答案

尝试类似的东西,

  • 实现一个线程来读取输入并将其存储在同步的 map/vector/list 等中。
  • 另一个线程正在监听该集合,然后它将处理该消息。

我认为这在某种程度上应该有所帮助...主要是,不要在系统输入上运行循环。试一试。

关于来自另一个线程的 Java 控制台输出被丢弃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7035072/

相关文章:

java - 自动售货机方案

java - 如何在java中使用数据类,而不使用getter方法?

java - 在 RDD 方法/闭包中使用 SparkContext hadoop 配置,例如 foreachPartition

android - 等待 TextToSpeech onInit() 初始化

java - 应用程序在主线程上做太多工作

java - 线程在打印之前完成执行

ruby-on-rails - 主要 : Object in rails console 的未定义方法 `y`

java - 从 Java 启动外部控制台应用程序

java - 如果属性没有规则,Hibernate 的 validateValue() 会抛出非法参数异常?

windows - 在 Windows 10 上编译 SASS 时 Gulp 输出乱码错误