如何使用其他线程(Java)打印多线程控制台输出消息?

如何使用其他线程(Java)打印多线程控制台输出消息?,java,multithreading,Java,Multithreading,我正在开发一个程序,其中包含一个方法,可以将控制台输出消息从控制台重定向到GUI中的JTextArea。该程序还使用一个线程,负责从外部设备获取一些值并在另一个GUI中打印它们。重定向方法和此线程不共享任何变量或对象。下面是一段代码: private JTextArea outputText; private void redirectSystemStreams() { OutputStream out = new OutputStream() { @Override

我正在开发一个程序,其中包含一个方法,可以将控制台输出消息从控制台重定向到GUI中的JTextArea。该程序还使用一个线程,负责从外部设备获取一些值并在另一个GUI中打印它们。重定向方法和此线程不共享任何变量或对象。下面是一段代码:

private JTextArea outputText;

private void redirectSystemStreams() {
    OutputStream out = new OutputStream() {
        @Override
        public void write(int b) throws IOException {
            updateTextArea(String.valueOf((char) b));
        }

        @Override
        public void write(byte[] b, int off, int len) throws IOException {
            updateTextArea(new String(b, off, len));
        }

        @Override
        public void write(byte[] b) throws IOException {
            write(b, 0, b.length);
        }
    };

    System.setOut(new PrintStream(out, true));
    System.setErr(new PrintStream(out, true));
}

private void updateTextArea(final String text) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            outputText.append(text);
        }
    });
}

public class MyThread implements Runnable {

    private static final int sleepDelay         = 100;

    public MyThread() {}


    @Override
    public void run() {
        try {
            //do something...
            while(true) {
                Thread.sleep(MyThread.sleepDelay);
                //do something...
            }


        } catch(Exception e) {
                //do something...
            }

    }

}
方法
redirectSystemStreams()
在GUI实例化期间只调用一次。之后,所有要打印到控制台输出的消息都应该打印在一个GUI中的JTextArea中

线程(来自MyThread)必须是同步的(每x秒执行一次)

我当前的问题如下:几天后,我注意到线程阻止
JTextArea
正确打印应该来自输出控制台的消息。当线程不运行时,
redirectSystemStreams()
工作正常

我知道其中一个问题可能在于线程的
run()
方法中的
while(true)
,但我对多线程还是比较熟悉,我真的不知道该怎么做。
这里最好的解决方案是什么?如果需要任何其他代码,请随时询问。

创建一个单独的线程来调用redirectSystemStreams,而不是主线程。您可能希望将睡眠延迟至少增加到1000。

您是如何注意到MyThread正在“阻塞”控制台输出的?此外,100ms是一个非常短的延迟。MyThread可能正在占用所有可用的cpu时间。我注意到这一点,因为当我对线程执行(MyThread.run())进行注释时,一切都正常工作。我将更改线程延迟并检查它是否有效…我不完全理解您的问题,但您可以从move try catch语句开始,进入while(true)循环。我刚刚做了一些测试,延迟值不是问题所在。另一个线程在做什么?