我有下面的代码告诉我我的数据是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.
答案 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秒才能得到响应。