Java 如何保证跨多个线程连续执行?
我正在编写一个应用程序,它提供了一个用户友好的GUI替代方案,以取代当前CLI用户用于与远程设备通信的方式。此应用程序将发送和接收所有CLI I/O,并将其转换为用户易于理解的语言 由于在执行期间,应用程序和远程设备之间几乎始终存在开放的SSH连接,因此后台线程正在处理来自远程端的InputStream并缓存它,以便我的应用程序可以使用它 我遇到的问题是,当我调用缓存数据时,它总是落后于应该显示的位置,然后显示为这样 后台线程类Java 如何保证跨多个线程连续执行?,java,multithreading,swing,Java,Multithreading,Swing,我正在编写一个应用程序,它提供了一个用户友好的GUI替代方案,以取代当前CLI用户用于与远程设备通信的方式。此应用程序将发送和接收所有CLI I/O,并将其转换为用户易于理解的语言 由于在执行期间,应用程序和远程设备之间几乎始终存在开放的SSH连接,因此后台线程正在处理来自远程端的InputStream并缓存它,以便我的应用程序可以使用它 我遇到的问题是,当我调用缓存数据时,它总是落后于应该显示的位置,然后显示为这样 后台线程类 我如何保证在调用UI之前将数据缓存更新到用户,以显示给用户?信号量
<>我如何保证在调用UI之前将数据缓存更新到用户,以显示给用户?
信号量或任何其他并发同步机制,例如在Win32应用程序中C++中的MinimalSype部分。您可以使用信号量进入线程,其中每个线程获取一个特定的信号量,并在递增其他相应信号量的同时递减该信号量。就是说,;
线程A获取信号量A并递减。我认为您没有顺序化问题。您的问题是,您需要构造一个新的扫描仪来读取每一行。这样会丢失一些输出,因为扫描仪是缓冲的。将扫描仪结构移到循环外。@EJP结束。这并不能解决问题,但我确实有间歇性的输出损失。我甚至没有注意到我把那条线放在循环里,把它移出去就解决了这个问题。谢谢大家!@垃圾天哪,我现在正在读。从某种程度上看,这可能就是我想要的。非常感谢。
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class ASAOutputStreamReader implements Runnable {
public volatile boolean stopNow;
private InputStream in;
public volatile String opString;
public volatile List<String> cachedOut = new ArrayList<String>();
ASAOutputStreamReader(InputStream in) {
this.in = in;
}
@Override
public void run() {
Scanner scan = new Scanner(in);
while (true) {
scan.useDelimiter("\r");
opString = scan.next();
System.out.println(opString);
// Add processed output to cache
cachedOut.add(opString);
if (stopNow) {
scan.close();
break;
}
}//end while
}
/* getNAT() - List<String>
* Method to return the cached strings
* from the ASA console, up to the point
* that the command was submitted
* NOTE: THIS WILL RETURN IN REVERSE ORDER
* But does not affect functionality
*/
public synchronized List<String> getNAT() {
List<String> str = new ArrayList<String>();
if (cachedOut.isEmpty() == false) {
for (int i = cachedOut.size()-1; i >= 0; i--) {
if (cachedOut.get(i).contains("show run static")) {
break;
}
str.add(cachedOut.get(i));
}
}
return str;
}
}
send_btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Defined separately to ensure Thread safety
updateNAT(listNATs, ip_tf.getText());
}
});
private void updateNAT(final JTextArea jta, final String host) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ACL1.sendCmd("show run static | include " + host + "\r");
String str = "";
for (String s : ACL1.asaOSMonitor.getNAT()) {
str = str.concat(s).concat("\n");
}
jta.setText(str);
}
});
}