Javax Swing Table Java by API

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
public class MainClass extends JFrame {
  public MainClass() {
    super("Dynamic Data Test");
    setSize(300, 200);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    JTable jt = new JTable(new MarketDataModel(5));
    JScrollPane jsp = new JScrollPane(jt);
    getContentPane().add(jsp, BorderLayout.CENTER);
  }
  public static void main(String args[]) {
    MainClass mt = new MainClass();
    mt.setVisible(true);
  }
}
class MarketDataModel extends AbstractTableModel implements Runnable {
  Thread runner;
  public MarketDataModel(int initialDelay) {
    Thread runner = new Thread(this);
    runner.start();
  }
  double[] data = new double[]{1,2,3,4,5};
  
  String[] headers = { "Symbol", "Price", "Change", "Last updated" };
  public int getRowCount() {
    return 1;
  }
  public int getColumnCount() {
    return headers.length;
  }
  public String getColumnName(int c) {
    return headers[c];
  }
  public Object getValueAt(int r, int c) {
    return data[c];
  }
  public void updateStocks() {
    for (int i = 0; i < data.length; i++) {
      data[i] = Math.random();
    }
  }
  public void run() {
    while (true) {
      updateStocks();
      fireTableRowsUpdated(0, data.length - 1);
      try {
        Thread.sleep(1000);
      } catch (InterruptedException ie) {
      }
    }
  }
}