Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
保持Java线程始终运行_Java_Multithreading_Javafx_Daemon_Runnable - Fatal编程技术网

保持Java线程始终运行

保持Java线程始终运行,java,multithreading,javafx,daemon,runnable,Java,Multithreading,Javafx,Daemon,Runnable,正在寻找一种优雅的方法,使Java线程在后台一直运行,只要应用程序正在运行,JavaFX应用程序就会检查用户凭据是否有效。 我将在线程中执行的操作是在特定时间间隔后使用户过期如果要使登录超时,可以使用暂停转换使登录过期: Duration timeout = Duration.minutes(...); PauseTransition logoutTimer = new PauseTransition(timeout); logoutTimer.setOnFinished(e -> exp

正在寻找一种优雅的方法,使Java线程在后台一直运行,只要应用程序正在运行,JavaFX应用程序就会检查用户凭据是否有效。
我将在
线程中执行的操作是在特定时间间隔后使用户过期

如果要使登录超时,可以使用
暂停转换
使登录过期:

Duration timeout = Duration.minutes(...);
PauseTransition logoutTimer = new PauseTransition(timeout);
logoutTimer.setOnFinished(e -> expireCredentials());
logoutTimer.play();
如果您需要在任何时候重置超时,只需执行以下操作即可

logoutTimer.playFromStart();
它将重置计时器

您还可以使用JavaFX属性使其在应用程序中易于管理。例如

private BooleanProperty loggedIn = new SimpleBooleanProperty();

// ...

public void expireCredentials() {
    loggedIn.set(false);
}
然后,需要用户登录的操作可以检查此属性:

if (loggedIn.get()) {
    doSecureOperation();
}
UI控件可以将其状态绑定到它:

submitSecureDataButton.disableProperty().bind(loggedIn.not());
loginButton.disableProperty().bind(loggedIn);
或许

private ObjectProperty<Credentials> credentials = new SimpleObjectProperty<>();

// ...

public void expireCredentials() {
    credentials.set(null);
}

// ...

submitSecureDataButton.disableProperty().bind(credentials.isNull());
loginButton.disableProperty().bind(credentials.isNotNull());
private ObjectProperty credentials=new SimpleObjectProperty();
// ...
公共无效到期债务(){
credentials.set(null);
}
// ...
submitSecureDataButton.disableProperty().bind(credentials.isNull());
loginButton.disableProperty().bind(credentials.isNotNull());

您为什么需要这样做?当然,只有当用户更改了某些内容(例如,提供了用户名或密码)时,这种情况才会发生变化。为什么不只是检查发生的时间?需要在JavaFX应用程序的某个时间间隔后使用户凭据过期您可以用该信息更新问题吗?还有其他相关信息,例如何时(在什么条件下)要重置超时?为什么不在超时后拒绝查询@james_d是对的,这里不需要后台线程。@DonBranson如果您希望UI是反应式的,您可能需要某种计时机制。对于用户来说,填写表单并提交表单不是一个好的用户体验,只有在收到通知后,他们的会话才会过期。您希望立即在UI中获得反馈。想知道PauseTransition与时间线的比较结果吗approach@JohnC基本上没有区别:
PauseTransition
在您需要的时候更方便。如果你想要一个重复的动作,或者想在多个时间点做事情,你需要一个时间表。两者的工作方式相同。(不涉及线程)是的,事实上,只要应用程序在运行,我就需要一直这样做。所以时间线看起来更适合我的用例then@JohnC当用户重新登录时,您是否会重新启动计时器?当用户自动注销时不会立即注销?@JohnC对,但是将
cycleCount
设置为
unfinite
的时间线将每隔
x
秒清空凭据。您希望在凭据登录后的几秒钟内将其注销。(假设用户离开机器,在
x
秒之后,凭据被清空。他们恰好返回并完成新登录
x-1
秒之后……他们将在1秒后再次注销。)因此,您只需创建一个
PauseTransition
并调用
playFromStart()
当用户登录时在其上。