问题描述
我对Java和多线程没有经验,所以也许你们可以帮忙.当我执行多线程处理时,在TextArea框中打印出一系列数字和字母时遇到问题.这是我的代码:
I am rather inexperienced with Java and multi-threading so maybe you guys can help. I am having trouble printing out a series of numbers and letters in a TextArea box when I multi-thread. This is my code:
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号.我也会得到随机结果,而每次都不会得到相同的输出也不会出错.
When I run the code, the threads do not usually print out all of what they are supposed to. For example, 'print100' does not always print to number 100 like it's supposed to. I also get random results and I never get the same output nor errors each time.
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)
我几乎可以肯定的是,同步代码中的多个线程是一个问题,但是我似乎无法弄清楚该特定代码的处理方法.
I am almost positive it is a problem with synchronizing the multiple threads in the code, but I can't seem to figure out how to do so for this specific code.
推荐答案
TextArea
实现显然不是线程安全的,因此您应确保在调用TextArea
对象上的方法时不会中断当前线程.例如,您可以通过同步TextArea
对象本身来做到这一点:
The TextArea
implementation is obviously not thread safe, so you should make sure that the current thread is not interupted while calling methods on your TextArea
object. You can do this for example by synchronizing on the TextArea
object itself:
synchronized (outputArea) {
outputArea.appendText(charToPrint + "");
}
这篇关于在Java中,如何在TextArea中使用多线程?我需要同步我的线程吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!