如何等待一段时间后再返回默认值?

时间:2015-05-18 07:21:06

标签: java multithreading timeout

我有下面的代码告诉我我的数据是PARTIAL还是FULL。它大部分时间都可以正常工作。

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();只是挂起而且它会一直等待。这段代码不在我的控制范围内,因为它是由其他一些团队开发的。

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

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

我使用的是Java 7.

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:0)

如果您不太了解执行程序服务,那么实现此目的的最简单方法是使用线程等待和通知机制:

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();
        }
    }

您可能需要做一些小改动才能使其工作并且看起来更好,而不是直接创建新线程,您可以使用Job来执行此操作以及根据您的要求进行一些其他更改。但主要思想仍然相同,即线程只会等待最多10秒才能得到响应。