有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有下面的代码,告诉我我的数据是部分的还是全部的。它在大多数情况下都很好用

public static String getTypeOfData {
    DataType type = new SelectTypes().getType();
    if (type == DataType.partial || type == DataType.temp) {
        return "partial";
    }
    return "full";
}

但有时,这条线会一直挂着,永远等待。这段代码不在我的控制范围内,因为它是由其他团队开发的

我想做的是,如果这行DataType type = new SelectTypes().getType();花费的时间超过10秒(或任何默认秒数),我的方法应该返回一个默认字符串,可以是partial

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

我正在使用Java7


共 (2) 个答案

  1. # 1 楼答案

    如果您不太了解executor服务,那么实现这一点的最简单方法是使用线程等待和通知机制:

    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秒即可获得响应

  2. # 2 楼答案

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

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

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

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

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