我需要使用两个线程将两个不同的字符附加到同一个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 + "");
}
}
}
此任务不需要使用两个线程。您只需按以下顺序调用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可用性检查,我特意降低了它的等级)。