如何暂停,恢复&停止“过程”& “依赖线程”在SwingWorker中运行

时间:2017-03-28 06:00:13

标签: java multithreading applet processbuilder swingworker

我正在开发Applets,我正在构建这样的GUI:

enter image description here

我使用了SwingWorkerThread,以便在JTable的几秒内有效地打印1000行。实际上,从doInBackground()我发出捕获日志的命令,这是使用Process实例实现的。此外,还有一个单独的Thread处理由Process实例捕获的输入。

但问题是我无法实现“暂停”和“暂停”的功能。 “停止”按钮。 我已经看到一些帖子已经实现了这样的功能:

protected Void doInBackground() throws Exception {
while (!isCancelled()) {
    if (!isPaused()) {
        publish("Writing...");
    } else {
        Thread.sleep(200);
    }
}
return null;

}

问题1: 但我的代码中的难度process.waitFor()只执行一次,我无法在循环中检查“暂停”变量或isCancelled()方法。 另外,为了更快地实现,我从不同的publish() s(Thread)调用了InputConsumer方法。 我想知道如何同时暂停两个(Process& InputStream)线程的执行。

问题2:执行“停止”按钮。 worker.cancel(true)的调用不会停止执行从doInBackground()方法创建的线程。

仅执行“运行”按钮的工作代码如下所示:

public class LogViewer extends javax.swing.JApplet {
    BufferedReader br;
    DefaultTableModel model;
    TableSwingWorker worker;
    @Override
    public void init() {
        try {
            //initialize GUI
            viewLogs();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void viewLogs() throws IOException{

        model = (DefaultTableModel)jTable1.getModel();
        worker = new TableSwingWorker(model);

    }

    public class TableSwingWorker extends SwingWorker<Integer, Object[]>{
        private DefaultTableModel tableModel;
        public TableSwingWorker(DefaultTableModel tableModel){
            this.tableModel = tableModel;
        }

        @Override
        protected Integer doInBackground() throws Exception {

            String[] command = {"CMD", "/C", "adb logcat"};
            ProcessBuilder probuilder = new ProcessBuilder(command);
            Process process = probuilder.start();

            InputConsumer consumer = new InputConsumer(process.getInputStream());
            consumer.start();

            int result = process.waitFor();
            consumer.join();

            return result;

        }

        @Override
        protected void process(List<Object[]> chunks) {
            for(Object[] row: chunks)
                tableModel.addRow(row);
        }

        protected void processOutput(String text){
            //process text received
            publish(new Object[]{line, date, time, PID, TID, loglevel, tag, message});
        }

        public class InputConsumer extends Thread {
            private InputStream is;

            public InputConsumer(InputStream is){
                this.is = is;
                start();
            }

            @Override
            public void run() {
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                try{
                    String text = null;
                    while((text = br.readLine()) != null){
                        processOutput(text);
                    }
                }
                catch(IOException ex){
                    ex.printStackTrace();
                }
            }
        }
    }              
}

对此问题的任何帮助都将深表感谢。请评论我方面的更多澄清。

0 个答案:

没有答案