我正在用JavaFXJava1.7编程,我需要帮助解决线程问题。我所需要的只是让我的程序写出“ping”,同时它得到设备的IP并点击它。问题是,如果我把这两个线程放在一个线程中,而不是只执行第一个线程。如果我只将其中一个放在线程中,而不是在线程中执行的话。对于如何运行第一个线程,有比第二个线程更好的方法吗?或者任何其他的方法来获得“Ping”文本写出来的Ping标签,而程序得到的ip和点击它?
@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天了.
发布于 2014-08-21 17:08:12
这件事在其他地方都很好,但是.关于JavaFX应用程序中的线程,需要了解的两件最重要的事情是:
Task类是Runnable的一个实现(因此它可以传递给Threads),它为在implementation线程上更新UI提供了各种挂钩。爪哇有很多清晰的例子。
在特定情况下,第一个Task是多余的。它所做的唯一的事情就是更新UI (所以它不能在后台线程中执行),而且其中没有需要很长时间执行的代码。因此,这应该直接在FX应用程序线程中执行。
第二个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();
}发布于 2014-08-21 17:09:33
我终于找到了一个解决方案,它确实解决了我想要的,但它不会使它成为多线程代码。
@FXML
private void Button(ActionEvent event) throws IOException {
Ping.setWrapText(true);
Task<Void> task2 = new Task<Void>() {
@Override
public Void call() throws IOException {
updateMessage("Pinging");
PingIp.PingIp(GetIp.retIp()).toString();
text2 = text2.substring(1, (text2.length() - 1));
updateMessage(text2);
return null;
}
};
Ping.textProperty().bind(task2.messageProperty());
new Thread(task2).start();
}谢谢你的帮助,但是^^作为“可能的复制”发布的Libk给了我一个尝试这个的想法。
https://stackoverflow.com/questions/25428762
复制相似问题