Ti faccio "gentilmente" un esempio guarda se ti può andare bene.

codice:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class MioCalcolo implements Runnable {
    private Thread thread;
    private JTextArea jta;
    
    public MioCalcolo(JTextArea jta) {
        this.jta = jta;
    }

    public boolean esegui() {
        if (thread != null && thread.isAlive())
            return false;
    
        thread = new Thread(this);
        thread.start();

        return true;
    }
    
    public void run() {
        for (int i = 0; i < 3; i++) {
            jta.append("Calcolo in fase: " + i + "\n");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ie) {
            }
        }
    }
}

class Demo extends JFrame {
    private MioCalcolo mc;
    private JTextArea jta;

    public Demo() {
        // jtextarea
        jta = new JTextArea(5, 20);
        // jbutton
        mc = new MioCalcolo(jta);	    
        JButton start = new JButton("Start");
        start.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent ae) {
                boolean ret = mc.esegui();
                if (!ret)
                    jta.append("Ancora in esecuzione\n");
             }
        });
        // jframe        
        getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS));
        jta.setAlignmentX(Component.CENTER_ALIGNMENT);
        start.setAlignmentX(Component.CENTER_ALIGNMENT);                
        add(jta);
        add(start);		
        setSize(400, 300);
    }

    public static void main(String args[]) {
       new Demo().setVisible(true);
   }
}
Ho fatto una piccola correzione, ora è ok.