求一个JavaFX,线程问题

程序运行如下:图片说明
先设置时间间隔,然后点击开始 ,生成输入后,点击停止 也会停止,但是再次点击开始会抛出如图异常。
请各位大神帮忙解决.
(知道可以用util工具Timer,Timer;但如何不用工具类,只用线程。)
代码如下 :
---1.显示界面
package addData;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TestView extends Application{

public void start(Stage stage) throws Exception {
TableFX table = new TableFX();
VBox vb = table.createStage();
Scene scene = new Scene(vb);
stage.setTitle("定时添加数据");
stage.setWidth(600);
stage.setHeight(400);
stage.setScene(scene);
stage.show();
}

public static void main(String[] args) {
    launch(args);
}

}
---2.用线程自制定时器
package addData;

public abstract class ThreadTimer extends Thread{
private boolean flag;
private int time;

public void run(){
    while(true){
        if(flag){
            doThing();
            try {
                Thread.sleep(time*1000);
            } catch (InterruptedException e) {
                System.out.println("线程被中断");
            }
        }
    }
}

public abstract void doThing();
public ThreadTimer() {
    super();
}
public ThreadTimer(boolean flag) {
    super();
    this.flag = flag;
}
public ThreadTimer(int time) {
    super();
    this.time = time;
}
public ThreadTimer(boolean flag, int time) {
    super();
    this.flag = flag;
    this.time = time;
}
public boolean isFlag() {
    return flag;
}
public void setFlag(boolean flag) {
    this.flag = flag;
}
public int getTime() {
    return time;
}
public void setTime(int time) {
    this.time = time;
}

}

---3.实现按钮事件操控线程定时器
package addData;

import test3.MyTest.StringModel;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;

public class TableFX extends ThreadTimer{

HBox hb = new HBox();
Button start = new Button("开始");
Button stop = new Button("停止");
Label intervalLabel = new Label("时间间隔(秒)");
TextField interval = new TextField();

TableView<StringModel> table = new TableView<StringModel>();
ObservableList<StringModel> data = FXCollections.observableArrayList(new StringModel("11","aa"));

public void doThing() {
    System.out.println("正在添加数据");
    data.addAll(new StringModel("aa"+Math.random()*100, "bb"));
}

public VBox createStage(){
    //设置2个按钮,1个文本框
    hb.setSpacing(15);
    hb.setAlignment(Pos.CENTER);//设置box中控件居中
    hb.getChildren().addAll(start,stop,interval,intervalLabel);

    //设置按钮事件
    start.setOnAction(new EventHandler<ActionEvent>() {

        public void handle(ActionEvent event) {
            setTime(Integer.parseInt(interval.getText()));
            setFlag(true);
            start();
        }
    });
    stop.setOnAction(new EventHandler<ActionEvent>() {

        public void handle(ActionEvent event) {
            setFlag(false);
        }

    });

    //设置显示记录的表格
    TableColumn tc1 = new TableColumn("消息记录"); 
    tc1.setMinWidth(400);
    tc1.setMaxWidth(400);
    tc1.setCellValueFactory(new PropertyValueFactory<>("str1"));

    table.setItems(data);
    table.getColumns().addAll(tc1);

    //把HBox和 TableView 放进 VBox
    VBox vb = new VBox();
    vb.setSpacing(10);
    vb.setPadding(new Insets(10,10,10,10));
    vb.getChildren().addAll(hb,table);



    return vb;

}

}

指向的内存单元中取出矩阵B当前的元素暂存在r3
multu r1,r2,r3 ;temp1<-dat1[i]+dat2[j]
add r11,r11,r1 ;temp<-temp+temp1,累加到累加器
addi r10,r10,1 ;i++,计算矩阵A当前行的下个元素的索引
movfp2i r1,f3

add r7,r7,r1 ;j<-j+k,计算矩阵B的当前列的下个元素的索引
j calculate
asign: addi r1,r4,result ;r1表示矩阵C当前的地址
sb 0(r1),r11 ;store result,把新计算出来的元素放入当前内存单元
addi r4,r4,1 ;赋值完一个元素,偏移量自增1
addi r6,r6,1 ;矩阵B的当前列数自增1
j column ;矩阵B新的一列开始
leveladd: addi r5,r5,1 ;矩阵A当前行自增1
j line ;矩阵A新的一行开始
finish:
addi r10,r0,0 ;分别读出矩阵C的元素值
movfp2i r8,f1
movfp2i r12,f3
addi r2,r10,result
sw PrintfValue4,r1
addi r14,r0,PrintfPar4
trap 5
loop3:
lbu r1,0(r2)
sw PrintfValue,r1
addi r14,r0,PrintfPar
trap 5
addi r2,r2,1
sub r12,r12,1
beqz r12,outputC
j loop3
outputC:
sw PrintfValue1,r1
addi r14,r0,PrintfPar1
trap 5

sub r8,r8,1
beqz r8,againChoice
movfp2i r12,f3
j loop3
againChoice:
add r1,r0,Prompt6
jal InputUnsigned
beqz r1,end