我想将文件加载到我的应用程序中。我遇到的问题是文件可能需要无限长的时间来加载。
我想允许用户取消文件,如果他们想停止将文件加载到系统中。文件停止加载后,我想在同一线程中直接执行代码。
我写了一个简化的示例来说明如何实现。我的解决方案是为可能无限期加载的代码提供一个嵌套线程。如果用户取消,则会中断线程。
# Necessary for password protected SSH Keys:
ssh_agent_auth: true
# Nodes Definitions
nodes:
- address: 10.70.60.3 # hostname or IP to access nodes
user: docker # root user (usually 'root')
role: [controlplane,etcd,worker] # K8s roles for node
ssh_key_path: ~/.ssh/id_rsa # path to PEM file
...
services:
kube-apiserver:
extra_args:
feature-gates: "PersistentLocalVolumes=true,VolumeScheduling=true"
kubelet:
extra_args:
feature-gates: "PersistentLocalVolumes=true,VolumeScheduling=true"
# Default versions
system_images:
kubernetes: rancher/hyperkube:v1.10.5-rancher1
...
我遇到的问题是我想使用执行程序服务而不是仅使用线程,并且在有任何问题的情况下将异常传递出去。这意味着,尽管该解决方案有效,但最终将变得非常混乱且难以维护。
是否可以避免嵌套线程?
答案 0 :(得分:1)
添加两个线程都可以访问的boolean
参数,并将其传递到while
循环。当用户单击更改其值时,循环将停止并继续执行之后的代码。
答案 1 :(得分:-1)
您可以使用finally {}
块来避免嵌套线程:
final Thread t = new Thread(() -> {
try {
loadFile();
} catch (InterruptedException ex) {
ex.printStackTrace();
} finally {
// Code that must always be called whether the file isn't loaded or not
System.out.println("Do something after loading the file");
}
});
t.start();
// Wait 5 seconds then simulate the user cancelling loading the file
Thread.sleep(5000);
t.interrupt();