我正在尝试读取我在actionPerformed
JButton
函数内为我的界面创建的进程的输入流。为此,我实现了一个runnable类。问题是我得到了一个量子输出流,这意味着我可以说我得到50行,而不是大停顿,还有50行等等。更大的问题是线的顺序不一致。这是我的代码看起来像......
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt)
{
try{
String sCommand = "cmd /c \"myenvsetup.bat && myprogram.exe\"";
Runtime rt = Runtime.getRuntime();
pr = rt.exec(sCommand);
java.awt.EventQueue.invokeLater(new Runnable()
{
public void run()
{
try{
BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String line = null;
while((line = input.readLine()) != null){
jTextArea1.append(line + "\n");
jTextArea1.scrollRectToVisible(new Rectangle(0, jTextArea1.getHeight(), 0, 0));
jTextArea1.update(jTextArea1.getGraphics());
}
pr.waitFor();
} catch (Exception e) {
}
}
});
} catch (Exception e){
}
}
答案 0 :(得分:0)
简而言之,您不应该在事件线程中执行任何阻塞I / O.使用另一个线程,
答案 1 :(得分:0)
你应该使用摇摆工人。我编写了一个使用执行程序来执行IO的示例。
SELECT t1.ID, COALESCE(t2.ID, '') AS CID, COALESCE(t2.VAL, '')
FROM tableA t1 LEFT JOIN tableA t2
ON t1.ID = t2.CID
WHERE t1.CID IS NULL
此示例的目的是显示,您在执行程序线程上执行工作,然后将更改发布到EDT。
ExecutorService executor = newSingleThreadExecutor()
SwingWorker类负责从EDT开始工作并允许您发布工作。这种情况更合适。
你不应该使用.update(Graphics g)。