UIとセットアップの簡単な説明
1)ボタン1とボタン2、テキストエリア1とテキストエリア2のプレーンバニラフレーム
2)Button1はswingworker myswingworker1を使用して継続実行タスクを起動し、swingworkerのプロセスメソッドはtextarea1を継続的に更新します
3)Button2はswingworker myswingworker2を使用して連続実行タスクを起動し、swingworkerのプロセスメソッドはtextarea2を継続的に更新します
この場合、継続的に実行されるタスクは「adb logcat」です。このコマンドは、継続的なログ情報をアウトストリームに書き込み続け、それをキャプチャしてテキストエリアに出力します。このキャプチャと印刷は、swingworker内で行われます。
問題
button1またはbutton2のどちらか最初に開始されたボタンのいずれかで、一度に1つのボタンだけが出力をテキストエリアに印刷するという意図されたタスクを実行しているようです。ただし、UIがフリーズすることはありません。
実験の一環として、1つの長時間実行タスクを、実行してすぐに戻るコマンド「dir」に置き換えました。つまり、button2に「dir」をアタッチしました。これで、 button2を実行すると機能し、次にbutton1も機能します。逆にすると、 button1によって開始された長時間実行タスクのみが実行され、 button2によって開始されたタスクは、長時間実行タスクが終了するのを待っているように見えます。これは、swingworkerを使用する目的全体を無効にします。
この問題をどのように解決しますか?UIが1人のSwingWorkerの終了を待たないようにするにはどうすればよいですか?
コードの抜粋
public class multiswing extends javax.swing.JFrame {
public multiswing() {
initComponents();
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
myswingworker1 m1=new myswingworker1(jTextArea1);
m1.execute();
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
myswingworker2 m2=new myswingworker2(jTextArea2);
m2.execute();
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new multiswing().setVisible(true);
}
});
}
public class myswingworker1 extends SwingWorker {
JTextArea jTextArea = new JTextArea();
Process proc;
Runtime rt = Runtime.getRuntime();
public myswingworker1(JTextArea jTextArea) {
this.jTextArea = jTextArea;
}
protected Void doInBackground() throws Exception {
String line = null;
rt = Runtime.getRuntime();
proc = rt.exec("adb logcat");
InputStream stdin = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stdin);
BufferedReader br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
publish(line);
}
return null;
}
@Override
protected void process(List<String> chunks) {
String data = chunks.get(0);
jTextArea.append(data + "\n");
}
}
public class myswingworker2 extends SwingWorker {
JTextArea jTextArea = new JTextArea();
Process proc;
Runtime rt = Runtime.getRuntime();
public myswingworker2(JTextArea jTextArea) {
this.jTextArea = jTextArea;
}
@Override
protected Void doInBackground() throws Exception {
String line = null;
rt = Runtime.getRuntime();
proc = rt.exec("dir");
InputStream stdin = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stdin);
BufferedReader br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
publish(line);
}
return null;
}
@Override
protected void process(List<String> chunks) {
String data = chunks.get(0);
jTextArea.append(data + "\n");
}
}