gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:54:04 25 4
gpt4 key购买 nike

我对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)

我几乎肯定地说,同步代码中的多个线程是一个问题,但是我似乎无法弄清楚该特定代码的处理方法。

最佳答案

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com