我正在开发Applets,我正在构建这样的GUI:
我使用了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();
}
}
}
}
}
对此问题的任何帮助都将深表感谢。请评论我方面的更多澄清。