当前位置: 首页 > 知识库问答 >
问题:

使用两个线程会导致JavaFX崩溃[重复]

单于高逸
2023-03-14

我需要使用两个线程将两个不同的字符附加到同一个JavaFX TextArea。我可以让一个工作,但是当我添加第二个线程时,它会因为一些很长的异常而中断。我做错了什么?

我研究了这个问题以寻求指导,它让我得到了一个线程工作,但不是两个:在两个独立的JavaFx TextArea中显示两个不同线程的输出

package application;
    

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;



public class Main extends Application {
    
    
    @Override
    public void start(Stage primaryStage) {
        
        try {
            BorderPane root = new BorderPane();
            TextArea textArea = new TextArea();
            textArea.setWrapText(true);
            root.setCenter(textArea);
            textArea.setText("");
            
            new Thread(() -> PrintChar(textArea, 'a', 100)).start();
            new Thread(() -> PrintChar(textArea, 'b', 100)).start();
                    
            
            Scene scene = new Scene(root,400,400);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        launch(args);
    }
    
    private void PrintChar(TextArea textArea, char letter, int numb)
    {
        for(int i = 0; i < numb; ++i)
        {
            textArea.appendText(letter + "");
        }
    }
}

共有1个答案

谈琦
2023-03-14

此任务不需要使用两个线程。您只需按以下顺序调用PrintChar方法:

PrintChar(textArea, 'a', 100);
PrintChar(textArea, 'b', 100);

使用此选项将导致textArea输出如下所示,每个输出100:

AAAAA。。。。。bbbbbb。。。。。

但是,如果您“想要”使用两个这样的线程:

new Thread(() -> PrintChar(textArea, 'a', 100)).start();
new Thread(() -> PrintChar(textArea, 'b', 100)).start();

然后,您可以通过使用Platform.run稍后来安排UI更改,例如围绕与javafx组件交互的代码,如下所示:

Platform.runLater(() -> {
    textArea.appendText(letter + "");
});

这将导致文本区域被两个线程的混合更改,并且看起来像这样(如果不采取额外步骤,您无法控制执行顺序):

bbaaabbbbabbbaaaaa......

如果您想使用线程,但也使用同步,那么它与根本不使用线程没有真正的区别(至少在您的场景中),但是,您可以这样做:

private synchronized void PrintChar(TextArea textArea, char letter, int numb)
{
    for(int i = 0; i < numb; ++i)
    {
        //We still need to wrap the UI code, because other methods from other threads could still interact with the UI and cause issues
        Platform.runLater(() -> {
            textArea.appendText(letter + "");
        });
    }
}

输出如下所示,按顺序分别为100:

AAAAA。。。。。bbbbbb。。。。。

 类似资料:
  • 我已经在这个项目上工作了一段时间,不知道为什么Media类会导致我的应用程序在JavaFX(NetBeans)上崩溃。 在观看了几篇关于如何使用Media类的教程后,我想到了以下内容: 如果我用Media类注释掉这行代码,那么代码就可以工作,但我想在背景中添加音乐。我知道,在此之后,我必须使用MediaPlayer类,并将媒体对象传递给它,然后调用play()方法,但由于某些原因,当它未被注释掉时

  • 我正在使用内置于Web View的Android开发浏览器。其中我面临的一个问题是,当我访问http://crashmybrowser.com测试浏览器上的选项卡崩溃时,我的整个浏览器应用程序都会崩溃。但是,当在chrome或Opera上进行相同的测试时,这些浏览器会在崩溃中幸存下来,并且只有特定的选项卡崩溃是由于访问上述网站而预期的结果。有人能帮助理解我如何在使用Webview的浏览器上处理此崩

  • 问题内容: 我已经使用线程编写了python tkinter代码,以便tkinter向导通过在主线程中运行的tkinter mainloop和在单独线程中运行的后台进程自动更新。但是我注意到,运行代码一段时间后python崩溃了。此外,它本质上是随机的,但python大部分时间都崩溃。我写了一个小的测试代码来显示这个问题(我的原始代码与此类似,但是具有一些实际的过程和许多其他功能,因此我将共享测试

  • 这里是Android开发者新手。我在MainActivity中使用recyclerview,应用程序不断崩溃。 任何帮助都将受到赞赏! 编辑:对不起,我是新来的。我已经附加了Logcat。和其他xml文件。谢谢 这是我的代码: 列出你的布局。xml: activity_main.xml: } ProductAdapter。java类: } Logcat: 致命异常:主进程:e.wolverine2

  • 我试图从我的框架中获得轮廓,这就是我所做的: .................................................... 程序在处崩溃,我收到以下错误消息: OpenCV错误:不支持的格式或格式组合([开始]FindContour只支持8uC1和32sC1图像)在未知的功能,文件......\src\openc v\模块\imgproc\src\contours.cp

  • 如果设备Google Play services版本没有更新,在我的应用程序上使用以下代码会导致应用程序崩溃。 它在Android OS版本4.2.2和Google Play Services版本3.1.58的设备上崩溃(为了处理Google Play Services可用性检查,我特意降低了它的等级)。