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

标签 java multithreading synchronization

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

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 + "");
        }
    }
}

当我运行代码时,线程通常不会打印出它们应该打印的所有内容。例如,“print100”并不总是像预期那样打印到数字 100。我还得到随机结果,并且每次都不会得到相同的输出或错误。

Exception in thread "Thread-6" Exception in thread "Thread-4" java.lang.IndexOutOfBoundsException
    at javafx.scene.control.TextInputControl.getText(TextInputControl.java:451)
    at javafx.scene.control.TextInputControl.updateContent(TextInputControl.java:564)
    at javafx.scene.control.TextInputControl.replaceText(TextInputControl.java:548)
    at javafx.scene.control.TextInputControl.insertText(TextInputControl.java:473)
    at javafx.scene.control.TextInputControl.appendText(TextInputControl.java:463)
    at threader.PrintChar.run(Threader.java:53)
    at java.lang.Thread.run(Thread.java:748)
java.lang.IndexOutOfBoundsException
    at javafx.scene.control.TextInputControl.getText(TextInputControl.java:451)
    at javafx.scene.control.TextInputControl.updateContent(TextInputControl.java:555)
    at javafx.scene.control.TextInputControl.replaceText(TextInputControl.java:548)
    at javafx.scene.control.TextInputControl.insertText(TextInputControl.java:473)
    at javafx.scene.control.TextInputControl.appendText(TextInputControl.java:463)
    at threader.PrintNum.run(Threader.java:71)
    at java.lang.Thread.run(Thread.java:748)

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

最佳答案

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

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

并将行 outputArea.appendText(...); 替换为 MultiThread.setText(...)

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

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

关于java - 在Java中,如何在TextArea中使用多线程?我需要同步我的线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58948047/

相关文章:

java - 测试对事务服务的同时调用

go - 同步 worker 以进行递归抓取

java - Bouncy CaSTLe 的安全异常

java - 如何实现基于 openId java web 的应用程序?

java - 如何在 concurrentHashMap 中突破 foreach

multithreading - 有什么办法可以像在Java中那样在 Octave 中使用线程

Android Camera.PreviewCallback 调度(使用 OpenGL 和 OpenCV)

java - Swing - 在我的程序中组织 JFrames(或 JDialogs???)

c++ - 为什么图书馆要在 Windows 上实现自己的基本锁?

android - 什么是 ContentResolver requestSync 帐户名称?