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