取消无限循环

时间:2018-07-12 11:40:54

标签: java

我想将文件加载到我的应用程序中。我遇到的问题是文件可能需要无限长的时间来加载。
我想允许用户取消文件,如果他们想停止将文件加载到系统中。文件停止加载后,我想在同一线程中直接执行代码。

我写了一个简化的示例来说明如何实现。我的解决方案是为可能无限期加载的代码提供一个嵌套线程。如果用户取消,则会中断线程。

# 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
...

我遇到的问题是我想使用执行程序服务而不是仅使用线程,并且在有任何问题的情况下将异常传递出去。这意味着,尽管该解决方案有效,但最终将变得非常混乱且难以维护。

是否可以避免嵌套线程?

2 个答案:

答案 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();