Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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_Timeout - Fatal编程技术网

Java 如何等待一段时间,然后返回默认值?

Java 如何等待一段时间,然后返回默认值?,java,multithreading,timeout,Java,Multithreading,Timeout,我有下面的代码告诉我我的数据是部分的还是全部的。它大部分时间都很好用 public static String getTypeOfData { DataType type = new SelectTypes().getType(); if (type == DataType.partial || type == DataType.temp) { return "partial"; } return "full"; } 但有时,这一行DataTyp

我有下面的代码告诉我我的数据是部分的还是全部的。它大部分时间都很好用

public static String getTypeOfData {
    DataType type = new SelectTypes().getType();
    if (type == DataType.partial || type == DataType.temp) {
        return "partial";
    }
    return "full";
}
但有时,这一行
DataType type=newselecttypes().getType()只是挂起,它一直在等待。此代码不在我的控制范围内,因为它是由其他一些团队开发的

我想做的是,如果此行
DataType=newselecttypes().getType()
需要10秒以上(或任何默认秒数),我的方法应该返回一个默认字符串,可以是
部分

这有可能吗?任何例子都能帮助我更好地理解

我正在使用Java 7。

提供了一些方法,允许您计划任务并使用超时选项调用它们。这应该满足您的要求,但是请注意,因为终止线程可能会使应用程序处于不一致的状态。

如果可能的话,您应该联系API的所有者,要求澄清或提供更多信息

编辑:根据你的评论,缓存是可能的吗?这意味着,在启动或其他某个点上,应用程序通过
SelectTypes
获取它们的类型并存储它们。假设这些不经常更改,您可以定期保存/更新它们

编辑2:根据你的其他评论,我真的无法添加更多的细节。您需要添加一个方法调用,该调用允许您的应用程序在启动时设置这些方法(这将取决于您使用的框架,如果有的话)


一种可能的方法是将包含
getTypeOfData()
方法的类设置为
Singleton
。然后,您将修改该类以提取该信息作为其创建机制的一部分。最后,您将创建一个
映射
,在其中输入所有类型。您可以使用
getClass().getName()
来填充映射的键,以及您现在对值部分所做的操作。

如果您不清楚执行器服务,那么实现这一点的最简单方法是使用线程等待和通知机制:

private final static Object lock = new Object();
private static DataType type = null;
public static String getTypeOfData {
new Thread(new Runnable() {

                @Override
                public void run() {
                    fetchData();
                }
            }).start();

  synchronized (lock) {
                try {
                    lock.wait(10000);//ensures that thread doesn't wait for more than 10 sec
                    if (type == DataType.partial || type == DataType.temp) {
                        return "partial";
                    }else{
                        return "full";
                    }
                } catch (InterruptedException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
    return "full";
}

private static void fetchData() {
        synchronized (lock) {
            type = new SelectTypes().getType();
            lock.notify();
        }
    }

您可能需要做一些小的更改以使其工作,并且看起来更像是您可以使用作业来完成这项工作,而不是直接创建新线程,以及根据您的需求进行一些其他更改。但主要思想仍然是线程只需等待最长10秒即可获得响应。

这取决于调用的API是否支持
Thread\interrupt
您可以将该指令封装在一个Runnable中,并在一个单独的线程中运行。它不支持
Thread\interrupt
,因此我无法使用此选项。是的,它必须使用这是唯一的启动和缓存,所以它的一次初始化为我。如果可能的话,你能举例说明我将如何做到这一点吗?