Javafx,组织线程

BalázsSzabó

我正在javafx java 1.7中编程,我需要有关线程问题的帮助。我所需要的只是让我的程序写出“ Ping”,同时它获取设备的IP并对其执行ping操作。问题是,如果我将两者都放入一个线程中,则只执行第一个。如果我只将其中一个放入线程,则执行不在线程中的那个。关于如何运行第一个线程比第二个线程有任何想法吗?还是有其他方法可以在程序获取ip并对其进行ping操作的同时,将“ Ping”文本写入Ping标签?

@FXML
    private void ciscoButton(ActionEvent event) throws IOException {
        CiscoPing.setWrapText(true);
        Task<Void> task1 = new Task<Void>() {
            @Override public Void call() throws IOException {
        String text1;
        text1 = "Pinging";
        Ping.setWrapText(true);
                Ping.setText(text1);
                return null;

    }
};
new Thread(task1).start();

        Task<Void> task = new Task<Void>() {
            @Override public Void call() throws IOException {
                String text2 = PingIp.PingEtherAddr(GetIp.retIpEther()).toString();
                text2 = text2.substring(1, (text2.length() - 1));
                Ping.setWrapText(true);
                Ping.setText(text2);
                return null;
            }
        };
        new Thread(task).start();
    }

谢谢您的时间:) PS:是的,这是我第一次尝试使用线程,现在已经尝试3-4天了...

詹姆斯_D

SO上的其他地方都对此进行了很好的介绍,但是...关于JavaFX应用程序中的线程,要了解的两个最重要的事情是:

  1. 任何长时间运行的代码都应在FX Application Thread上执行
  2. 对UI的任何更改都必须在FX Application线程上执行

Task类是的一个实现Runnable(因此它可以被传递给ThreadS),其提供用于在FX应用程序线程更新UI的各种钩子。Javadoc中有丰富的明显的例子。

在您的特定情况下,第一个Task是多余的。它唯一要做的就是更新UI(因此一定不能在后台线程中执行),并且其中没有代码需要花费很长时间来执行。因此,应直接在FX Application Thread中执行此操作。

第二个Task执行长时间运行的调用以查找String,并String用于更新UI。因此,应将其声明Task<String>为其调用方法返回的String一个onSucceeded处理器可以用于通话结束时更新UI:

@FXML
private void ciscoButton(ActionEvent event) throws IOException {
    CiscoPing.setWrapText(true);
    String text1;
    text1 = "Pinging";
    Ping.setWrapText(true);
    Ping.setText(text1);

    final Task<String> task = new Task<String>() {
        @Override 
        public String call() throws IOException {
            String text2 = PingIp.PingEtherAddr(GetIp.retIpEther()).toString();
            return text2.substring(1, (text2.length() - 1));
        }
    };

    task.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
        @Override
        public void handle(WorkerStateEvent event) {
            Ping.setWrapText(true);
            String text = task.getValue(); // value returned from call()
            Ping.setText(text);
        }
    });
    new Thread(task).start();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

共享内存组织线程和块

来自分类Dev

JavaFX线程崩溃

来自分类Dev

JavaFX中的多线程

来自分类Dev

JavaFX线程崩溃

来自分类Dev

JavaFX中的多线程

来自分类Dev

在JavaFX中运行线程

来自分类Dev

在JavaFX中将括号用于家长组织

来自分类Dev

在JavaFX中将括号用于家长组织

来自分类Dev

javafx场景上的javafx线程异常

来自分类Dev

JavaFX事件调度线程与JavaFX应用程序线程?

来自分类Dev

从服务线程更新JavaFX GUI

来自分类Dev

在JavafX服务中运行线程

来自分类Dev

JavaFX 应用程序线程

来自分类Dev

多线程 JavaFX 用户界面

来自分类Dev

Python:组织此线程的最佳方法是什么?

来自分类Dev

JavaFX多线程-加入线程不会更新UI

来自分类Dev

从不同线程同步请求JavaFX线程内的数据

来自分类Dev

使用JavaFX Tasks正确执行多线程和线程池

来自分类Dev

为什么线程会阻塞我的JavaFX UI线程?

来自分类Dev

JavaFX和GUI线程:从线程更改按钮文本

来自分类Dev

Javafx 线程加入交通灯 UI。如何同步线程?

来自分类Dev

在单独的线程中运行JavaFX Controller

来自分类Dev

JavaFX应用程序线程如何工作?

来自分类Dev

从JavaFX中的不同线程更新UI

来自分类Dev

JavaFX Task线程未终止

来自分类Dev

如何使用JavaFX进行多线程

来自分类Dev

JavaFx-工作线程-启动(args)

来自分类Dev

从UI JavaFX监听后台线程

来自分类Dev

支持者JavaFX线程实现