我正在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天了...
SO上的其他地方都对此进行了很好的介绍,但是...关于JavaFX应用程序中的线程,要了解的两个最重要的事情是:
的Task
类是的一个实现Runnable
(因此它可以被传递给Thread
S),其提供用于在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] 删除。
我来说两句