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();
    }
}