在Java中,如何在TextArea中使用多线程?我需要同步我的线程吗?

在Java中,如何在TextArea中使用多线程?我需要同步我的线程吗?,java,multithreading,synchronization,Java,Multithreading,Synchronization,我对Java和多线程技术缺乏经验,所以也许你们能帮我。当我使用多线程时,在文本框中打印一系列数字和字母时遇到问题。这是我的代码: public class MultiThread extends Application { static TextArea outputArea = new TextArea(); @Override public void start(Stage primaryStage) throws Exception { outputAre

我对Java和多线程技术缺乏经验,所以也许你们能帮我。当我使用多线程时,在文本框中打印一系列数字和字母时遇到问题。这是我的代码:

public class MultiThread extends Application {
    static TextArea outputArea = new TextArea();
@Override
    public void start(Stage primaryStage) throws Exception {

        outputArea.setWrapText(true);
        Runnable printA = new PrintChar('a', 100);
        Runnable printB = new PrintChar('b', 100);
        Runnable print100 = new PrintNum(100);

        // Create threads
        Thread thread1 = new Thread(printA);
        Thread thread2 = new Thread(printB);
        Thread thread3 = new Thread(print100);

        thread1.start();
        thread2.start();
        thread3.start();

        Scene scene = new Scene(outputArea, 250, 130);
        primaryStage.setTitle("Concurrent Output");
        primaryStage.setScene(scene);
        primaryStage.show();}


    public static void main(String[] args) {
        launch(args);
    }
}
class PrintChar extends MultiThread implements Runnable {
    private char charToPrint; // The character to print
    private int times; // The times to repeat

    public PrintChar(char c, int t) {
        charToPrint = c;
        times = t;
    }

    @Override
    public void run() {
        for (int i = 0; i < times; i++) {
            outputArea.appendText(charToPrint + "");
        }
    }
}

class PrintNum extends MultiThread implements Runnable {
    private int lastNum;
    private char charToPrint;

    public PrintNum(int n) {
        lastNum = n;
    }

    @Override
    public void run() {
        for (int i = 1; i <= lastNum; i++) {
            outputArea.appendText(i + "");
        }
    }
}

我几乎可以肯定,同步代码中的多个线程是一个问题,但我似乎不知道如何为这段特定代码执行此操作。

TextArea实现显然不是线程安全的,因此,在调用
TextArea
对象上的方法时,应该确保当前线程没有中断。例如,您可以在
TextArea
对象本身上进行同步:

synchronized (outputArea) {
    outputArea.appendText(charToPrint + "");
}

多线程
类中创建一个静态函数,如下所示:

public static synchronized setText(String str) {
     outputArea.appendText(str);
}
并替换行
outputArea.appendText(…)多线程.setText(…)
进行编码>

问题:您当前正在从三个线程设置outputArea上的文本,同时它们都试图在outputArea上追加文本。因此,outputArea中用于追加文本的索引与其他线程重叠

解决方案:确保只有一个线程尝试在outputArea上追加文本

public static synchronized setText(String str) {
     outputArea.appendText(str);
}