我在我的代码中使用Java Callable Future。下面是我使用未来和callables的主要代码 -
下面是我使用未来和callables的主要代码 -
public class TimeoutThread {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newFixedThreadPool(5);
Future<TestResponse> future = executor.submit(new Task());
try {
System.out.println(future.get(3, TimeUnit.SECONDS));
} catch (TimeoutException e) {
}
executor.shutdownNow();
}
}
下面是我的Task
类,它实现了Callable接口,我在其中使用RestTemplate
对我的SERVERS进行REST URL调用。然后我将response
变量传递给checkString
方法,我在其中反序列化JSON字符串,然后我检查密钥是否包含error
或warning
然后在此基础上制作TestResponse
。
class Task implements Callable<TestResponse> {
private static RestTemplate restTemplate = new RestTemplate();
@Override
public TestResponse call() throws Exception {
String url = "some_url";
String response = restTemplate.getForObject(url, String.class);
TestResponse response = checkString(response);
}
}
private TestResponse checkString(final String response) throws Exception {
Gson gson = new Gson(); // is this an expensive call here, making objects for each and every call?
TestResponse testResponse = null;
JsonObject jsonObject = gson.fromJson(response, JsonObject.class); // parse, need to check whether it is an expensive call or not.
if (jsonObject.has("error") || jsonObject.has("warning")) {
final String error = jsonObject.get("error") != null ? jsonObject.get("error").getAsString() : jsonObject
.get("warning").getAsString();
testResponse = new TestResponse(response, "NONE", "SUCCESS");
} else {
testResponse = new TestResponse(response, "NONE", "SUCCESS");
}
return testResponse;
}
所以我的问题是我应该如何在这里声明GSON
?它应该在我的Task类中声明为静态最终全局变量吗? Bcoz目前我正在使用gson解析JSON以及我正在进行的每次调用new Gson()
哪个都很昂贵?
答案 0 :(得分:13)
Gson
对象在多个线程中显然是安全的,因为它不保留任何内部状态,所以是的,声明private static final Gson GSON = new Gson();
,甚至使它成为public
。
请注意,如果您希望客户端代码能够使用GsonBuilder
自定义呈现,则应接受Gson
对象作为参数。
答案 1 :(得分:0)
Gson库可以在类级别定义并在任何地方使用,因为它不会在不同的调用中维护状态。由于它不维护状态,您可以声明它一次并在任何地方使用它(如果需要重用它,可以少一行代码)。多线程对它没有影响。 另一方面,在其官方文档中查看它的性能指标,它似乎并不昂贵。