Java 如何保证跨多个线程连续执行?

Java 如何保证跨多个线程连续执行?,java,multithreading,swing,Java,Multithreading,Swing,我正在编写一个应用程序,它提供了一个用户友好的GUI替代方案,以取代当前CLI用户用于与远程设备通信的方式。此应用程序将发送和接收所有CLI I/O,并将其转换为用户易于理解的语言 由于在执行期间,应用程序和远程设备之间几乎始终存在开放的SSH连接,因此后台线程正在处理来自远程端的InputStream并缓存它,以便我的应用程序可以使用它 我遇到的问题是,当我调用缓存数据时,它总是落后于应该显示的位置,然后显示为这样 后台线程类 我如何保证在调用UI之前将数据缓存更新到用户,以显示给用户?信号量

我正在编写一个应用程序,它提供了一个用户友好的GUI替代方案,以取代当前CLI用户用于与远程设备通信的方式。此应用程序将发送和接收所有CLI I/O,并将其转换为用户易于理解的语言

由于在执行期间,应用程序和远程设备之间几乎始终存在开放的SSH连接,因此后台线程正在处理来自远程端的InputStream并缓存它,以便我的应用程序可以使用它

我遇到的问题是,当我调用缓存数据时,它总是落后于应该显示的位置,然后显示为这样

后台线程类


<>我如何保证在调用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);
            }
        });
    }