如何在连续任务之间传递参数或引用(JavaFX)?
我有从JavaFx主线程触发的连续任务,每个任务调用一个服务。我从一个任务中检索到的值应该决定下一个任务的行为。我已经通过方法(下面的简化示例)实现了它,但它有点像意大利面条代码如何在连续任务之间传递参数或引用(JavaFX)?,java,spring-boot,javafx,task,java.util.concurrent,Java,Spring Boot,Javafx,Task,Java.util.concurrent,我有从JavaFx主线程触发的连续任务,每个任务调用一个服务。我从一个任务中检索到的值应该决定下一个任务的行为。我已经通过方法(下面的简化示例)实现了它,但它有点像意大利面条代码 import javafx.event.ActionEvent; import javafx.concurrent.Task; import java.util.concurrent.Executor; import java.util.concurrent.Executors; public class SomeC
import javafx.event.ActionEvent;
import javafx.concurrent.Task;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
public class SomeControllerClass{
private Executor exec;
@Autowired
private UserService userService;
@Autowired
private SessionService sessionService;
public void initialize() {
exec = Executors.newSingleThreadExecutor(runnable -> {
Thread t = new Thread(runnable);
t.setDaemon(true);
return t ;
});
}
@FXML
private void buttonAction(ActionEvent event){
final String user = userTextField.getText().trim();
final String pass = passTextField.getText().trim();
Task<UserBean> task1 = new Task<UserBean>(){
@Override
protected UserBean call() throws Exception{
return userService.getUserLogin(user, pass);
}
};
task1.setOnSucceeded(e -> secondTask(task1.getValue()));
task1.setOnFailed(e -> methodToNotifySomeException());
exec.execute(task1);
}
private void secondTask(UserBean bean){
//bean will be null only if the login failed
if(bean==null) someLabel.setText("Wrong user or password");
else{
Task<Void> task2 = new Task<Void>(){
@Override
protected Void call() throws Exception{
sessionService.setActiveUser(bean);
return null;
}
};
task2.setOnSucceeded(e -> methodToChangeScene());
task2.setOnFailed(e -> manageSomeException());
exec.execute(task2);
}
}
}
导入javafx.event.ActionEvent;
导入javafx.concurrent.Task;
导入java.util.concurrent.Executor;
导入java.util.concurrent.Executors;
公共类SomeControllerClass{
私人遗嘱执行人;
@自动连线
私人用户服务;
@自动连线
私人会话服务会话服务;
公共无效初始化(){
exec=Executors.newSingleThreadExecutor(可运行->{
螺纹t=新螺纹(可运行);
t、 setDaemon(true);
返回t;
});
}
@FXML
私有无效按钮操作(ActionEvent事件){
最终字符串user=userTextField.getText().trim();
最终字符串传递=passTextField.getText().trim();
任务task1=新任务(){
@凌驾
受保护的UserBean调用()引发异常{
返回userService.getUserLogin(user,pass);
}
};
task1.setOnSucceeded(e->secondTask(task1.getValue());
task1.setOnFailed(e->methodToNotifySomeException());
执行(任务1);
}
私有void第二个任务(UserBean){
//仅当登录失败时,bean才会为null
如果(bean==null)someLabel.setText(“错误的用户或密码”);
否则{
任务task2=新任务(){
@凌驾
受保护的Void调用()引发异常{
setActiveUser(bean);
返回null;
}
};
task2.setOnSucceed(e->methodToChangeScene());
task2.setOnFailed(e->manageSomeException());
执行(任务2);
}
}
}
我也尝试了,但大致相同,我无法实例化我的连续任务和找到某种方法到第二个任务,从第一个任务中检索值,而无需在方法中分离每个任务
我缺少的执行器实现是否允许在任务之间传递参数?有什么我完全不知道的“最佳实践”可以避免所有这些问题吗?您是否探讨了这些问题?你知道或不知道?也许其中一个就是你要找的?我没发现任何意大利面。事实上,只有一个地方有两个可能的执行分支。如果您只是尝试登录,为什么还要使用
任务
?也许userservice的任务
是好的,但是第二个任务不是。在第一个任务中
,返回一个布尔值
非用户bean
。不要使用第二个任务
。只需根据返回的`Boolean>在onSucceeded
中执行下一个操作。