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
JavaFx savely正在停止后台任务_Java_Multithreading_Javafx - Fatal编程技术网

JavaFx savely正在停止后台任务

JavaFx savely正在停止后台任务,java,multithreading,javafx,Java,Multithreading,Javafx,现在我有一个JavaFx程序,在线程中使用JavaFx任务作为后台进程 Task<Void> task = new Task<Void>( ){ @Override protected Void call() throws Exception { while(running){ doSomething(); } saveData(); return null;

现在我有一个JavaFx程序,在线程中使用JavaFx任务作为后台进程

Task<Void> task = new Task<Void>( ){
    @Override
    protected Void call() throws Exception {
        while(running){
            doSomething();
        }
        saveData();
        return null;
    }
};
Thread th = new Thread(task);
th.start();
同时,我在我的唯一阶段添加了一个CloseRequestListener

stage.setOnCloseRequest( e -> running = false);
现在我的问题是:

因为这个过程是Deamon,它可以在运行过程中被移除。有没有更好的方法确保在JavaFx进程终止后后台任务终止?(即使JavaFx进程被强制终止)

或者有没有一种方法可以顺利地杀死一条执事线索

编辑:我的首要任务是后台线程不能自己保持活动状态。第二个优先事项是尽可能平稳地终止后台线程。

已经有一个取消机制,因此不需要在运行
标志时自行实现(您必须小心使
易失性
,或使用其他方法确保从一个线程对其进行的更改在另一个线程中可见)

所以,只要做:

Task<Void> task = new Task<Void>( ){
    @Override
    protected Void call() throws Exception {
        while(! isCancelled()){
            doSomething();
        }
        saveData();
        return null;
    }
};
最后,您不应该在后台依赖
setOnCloseRequest()
:这仅在有外部调用关闭窗口时调用(例如,用户按下本机窗口关闭按钮)。例如,如果您调用
Platform.exit()
,它将不会被执行。相反,请重写
应用程序.stop()
方法:

@Override
public void stop() {
    task.cancel();
}
已经有一个取消机制,所以不需要自己使用
运行
标志来实现这一点(您必须小心使
易失性
,或者使用其他方法确保从一个线程到另一个线程的更改可见)

所以,只要做:

Task<Void> task = new Task<Void>( ){
    @Override
    protected Void call() throws Exception {
        while(! isCancelled()){
            doSomething();
        }
        saveData();
        return null;
    }
};
最后,您不应该在后台依赖
setOnCloseRequest()
:这仅在有外部调用关闭窗口时调用(例如,用户按下本机窗口关闭按钮)。例如,如果您调用
Platform.exit()
,它将不会被执行。相反,请重写
应用程序.stop()
方法:

@Override
public void stop() {
    task.cancel();
}

啊,谢谢=)你知道stop()方法是否会被毫无例外地调用吗?如果我保持线程为DeAMon,仍然存在一个问题,它可以在DOMMETHONSE()的中间被杀死。正如您所提到的,cancle()调用可以抛出一个中断的异常,它也可以中途中断doSomething()。我希望尽可能避免这种情况。例如,如果我更改数据,将其写入多个文件,并且进程中途停止,则数据可能会进入持久状态。只有当
doSomething()
具有可中断的阻塞调用时,这才是一个问题<代码>停止()
将被调用,除非您使用
系统退出。退出()
(它只会终止所有线程,因此除了不调用它之外,没有其他解决方法)。啊,谢谢=)您知道停止()方法是否会被毫无例外地调用吗?如果我保持线程为DeAMon,仍然存在一个问题,它可以在DOMMETHONSE()的中间被杀死。正如您所提到的,cancle()调用可以抛出一个中断的异常,它也可以中途中断doSomething()。我希望尽可能避免这种情况。例如,如果我更改数据,将其写入多个文件,并且进程中途停止,则数据可能会进入持久状态。只有当
doSomething()
具有可中断的阻塞调用时,这才是一个问题<除非您使用
System.exit()
退出,否则将调用code>stop()
(这只会终止所有线程,因此除了不调用它之外,没有其他解决方法)。