1) Per far partire i thread in maniera concorrente si utilizza la chiamata al metodo start e non run (anche se quello che devi sovrascrivere nella classe che estende thread e' il metodo run).
2) Per la reindirizazione dello standard output si puo' usare il metodo setOut() che prende come parametro un PrintStream. La cosa piu' semplice e' realizzarsi una classe che estende OutputStream, passargli come parametro la JTextArea via costruttore ed implementare il metodo write in modo che scriva sulla JTextArea. Nella classe che mandi in esecuzione istanzi uno stream di questo tipo, lo incapsuli in un PrintStream e lo passi a System.setOut().
Ti posto un po' di codice d'esempio.
codice:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
public class GUI extends JFrame implements ActionListener {
private JButton bottone;
private JScrollPane scroll;
private JTextArea log;
public GUI() {
super("Test");
//Inizializzo i componenti
bottone = new JButton("Process");
bottone.addActionListener(this);
log = new JTextArea();
log.setEditable(false);
scroll = new JScrollPane(log);
//Li posiziono nel frame
this.add(bottone, BorderLayout.NORTH);
this.add(scroll, BorderLayout.CENTER);
//Setto lo stream di output
System.setOut(new PrintStream(new TextAreaOutputStream(log)));
//Setto le impostazioni del frame
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setSize(200,100);
this.setVisible(true);
}
//Faccio partire un thread in maniera concorrente ad ogni pressione
public void actionPerformed(ActionEvent e) {
SimThread t = new SimThread();
t.start(); //INVECE CHE t.run()
}
//Classe che scrive uno stream su una JTextArea
class TextAreaOutputStream extends OutputStream{
private JTextArea console;
public TextAreaOutputStream(JTextArea console) {
this.console = console;
}
public void write(int b) throws IOException {
char[] c = Character.toChars(b);
for(char tmp : c)
console.append(Character.toString(tmp));
console.setCaretPosition(console.getDocument().getLength());
}
}
//Thread che simula un lavoro(con un'attesa) e poi stampa una stringa
class SimThread extends Thread {
public void run(){
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("STAMPO IL PARSING");
}
}
public static void main(String[] args) {
new GUI();
}
}